nodejs如何设置静态目录!不用express.纯nodejs实现!
发布于 8 年前 作者 caihuattkl 6650 次浏览 来自 问答

我的需求是这样的.我有一个目录,里面全是html文件.比如,stc目录(这个目录中有a.html,b.html),当用户访问 xxx.con/stc/a.html 就能访问到这个页面.但是当用户访问c.html的页面时就提示他不存在或者返回404, 如何实现呢?是不是要遍历这个stc目录啊,然后跟req.url去比较,但是感觉效率很低啊!!!? 很疑惑.请知道的朋友不吝赐教!

9 回复

用nginx就行了,跟node没关系

@blackjack node不能实现吗? 我有几千个html文件…╮(╯▽╰)╭

@caihuattkl 直接用http模块写要写好多代码,干嘛要重复造轮子嘛。如果想要个nginx的替代品可以试试redbird 如果只是想要个静态目录的web服务器,可以试试http-server

nginx不就行了嘛。。。

node是可以实现,用自己原生的http模块就可以,只不过没必要,你需要的是一个http服务器,而不是一个服务引擎,有好多http服务器在这方面都做到了极致,高性能、易部署、超稳定,nginx、lighttp、apache等等都可以呀,为什么一定要用node来写。

https://github.com/ChenShenhai/node-server 以前写过一个纯node.js的静态服务器,希望对你有帮助。

@libook 我就是生成一批页面自己用的.没必要用nginx的!

@caihuattkl 简单说吧,反正横竖都要用http服务器,使用现成的http服务器还是自己用node写一个?你用现成的HTTP服务器nginx的话只需要两行配置,用node自己写一个http服务器的话要写几十行,功能还不全,性能比nginx也差很多,你自己选咯。

var http = require('http');
var fs = require('fs');
var path = require('path');

http.createServer(function (request, response) {
    console.log('request starting...');

    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';

    var extname = path.extname(filePath);
    var contentType = 'text/html';
    switch (extname) {
        case '.js':
            contentType = 'text/javascript';
            break;
        case '.css':
            contentType = 'text/css';
            break;
        case '.json':
            contentType = 'application/json';
            break;
        case '.png':
            contentType = 'image/png';
            break;      
        case '.jpg':
            contentType = 'image/jpg';
            break;
        case '.wav':
            contentType = 'audio/wav';
            break;
    }

    fs.readFile(filePath, function(error, content) {
        if (error) {
            if(error.code == 'ENOENT'){
                fs.readFile('./404.html', function(error, content) {
                    response.writeHead(200, { 'Content-Type': contentType });
                    response.end(content, 'utf-8');
                });
            }
            else {
                response.writeHead(500);
                response.end('Sorry, check with the site admin for error: '+error.code+' ..\n');
                response.end(); 
            }
        }
        else {
            response.writeHead(200, { 'Content-Type': contentType });
            response.end(content, 'utf-8');
        }
    });

}).listen(8125);
console.log('Server running at http://127.0.0.1:8125/');

如果你想跨域访问的话还要加header:

// Website you wish to allow to connect
response.setHeader('Access-Control-Allow-Origin', '*');

// Request methods you wish to allow
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

// Request headers you wish to allow
response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
response.setHeader('Access-Control-Allow-Credentials', true);

不想重新造轮子,可以用https://github.com/expressjs/serve-static ,其内部做的事情和楼上说的差不多

回到顶部