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