在NodeJS中创建基本的静态文件服务器

33 浏览
0 Comments

在NodeJS中创建基本的静态文件服务器

我正在尝试创建一个静态文件服务器,更多是为了理解Node而不是完美的服务器。我很清楚像Connect和node-static这样的项目,并且完全打算在生产环境中使用这些库进行更适用的代码,但我也想理解我在使用的基础知识。考虑到这一点,我编写了一个小的server.js:

var http = require('http'),
    url = require('url'),
    path = require('path'),
    fs = require('fs');
var mimeTypes = {
    "html": "text/html",
    "jpeg": "image/jpeg",
    "jpg": "image/jpeg",
    "png": "image/png",
    "js": "text/javascript",
    "css": "text/css"};
http.createServer(function(req, res) {
    var uri = url.parse(req.url).pathname;
    var filename = path.join(process.cwd(), uri);
    path.exists(filename, function(exists) {
        if(!exists) {
            console.log("not exists: " + filename);
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.write('404 Not Found\n');
            res.end();
        }
        var mimeType = mimeTypes[path.extname(filename).split(".")[1]];
        res.writeHead(200, mimeType);
        var fileStream = fs.createReadStream(filename);
        fileStream.pipe(res);
    }); //end path.exists
}).listen(1337);

我的问题是双重的

  1. 这是创建和流式传输基本的html等在node中的“正确”方法,还是还有更好/更优雅/更健壮的方法?
  2. 在节点中的.pipe()基本上是在做以下事情吗?

.

var fileStream = fs.createReadStream(filename);
fileStream.on('data', function (data) {
    res.write(data);
});
fileStream.on('end', function() {
    res.end();
});

谢谢大家!

admin 更改状态以发布 2023年5月22日
0
0 Comments
  • 你的基本服务器看起来不错,但是:

    缺少一个return语句。

    res.write('404 Not Found\n');
    res.end();
    return; // <- Don't forget to return here !!
    

    还有:

    res.writeHead(200, mimeType);

    应该是:

    res.writeHead(200, {'Content-Type':mimeType});

  • 是的pipe()基本上是这样做的,它还会暂停/恢复源流(以防接收器较慢)。
    这是pipe()函数的源代码:https://github.com/joyent/node/blob/master/lib/stream.js

0
0 Comments

少即是多

先在你的项目中打开命令提示符,然后使用:

$ npm install express

接下来,按照以下方法编写你的app.js代码:

var express = require('express'),
app = express(),
port = process.env.PORT || 4000;
app.use(express.static(__dirname + '/public'));
app.listen(port);

然后,创建一个名为“public”的文件夹并将你的文件放置其中。我先尝试了更难的方式,但你必须担心mime类型,这需要耗费时间,还要担心响应类型等等……不,谢谢。

0