javascript - Node.js 查看源代码破坏了文件系统模块

标签 javascript node.js view-source

我正在尝试在 Node.js 中创建一个 Web 服务器,但遇到了一个奇怪的问题。

服务器正确响应查看页面的请求,但是当我在某些浏览器上查看页面源时, Node 服务器会抛出错误

fs.js:379
  binding.open(pathModule.toNamespacedPath(path),
          ^

TypeError: path must be a string or Buffer
    at Object.fs.readFile (fs.js:379:11)
    at Server.<anonymous> (/ProjectFolder/index.js:32:6)
    at Server.emit (events.js:180:13)
    at parserOnIncoming (_http_server.js:642:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:117:17)

我想,也许查看源代码的请求有一个奇怪的请求路径,但是a)它说TypeError,所以它会在resolveFileName函数中出错。 b) View 源不会只是在客户端以不同的方式显示请求结果,而不对请求进行任何更改吗?

Google chrome: Error
MS Edge: OK
Internet Explorer: Error
Netscape 8: OK

这是我的代码:

文件系统:

> ProjectFolder
| > index.js
| > svrpath
| | > file.html

index.js:

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

function resolveFileName(req){
  var typs = {
    ".html": "text/html",
    ".css": "text/css",
    ".js": "text/javascript"
  };
  if(req === "/"){
    return {
      fname: "./svrpath/file.html",
      type: "text/html"
    };
  }else if(/^.*\.(html|css|js)$/.test(req)){
    return {
      fname: "./svrpath" + req,
      type: typs[req.replace(/^.*(?=\.(html|css|js)$)/, "")]
    };
  }else if(/^.*\/$/.test(req)){
    return {
      fname:"./svrpath" + req.replace(/\/$/, "") + ".html",
      type: "text/html"
    };
  }else{
    return "error400";
  }
}

http.createServer(function(req, res){
  var file = resolveFileName(req.url);
  fs.readFile(file.fname, function(err, data){
    if(err){
      throw err;
    }
    res.writeHead(200, {"Content-Type": file.type});
    res.end(data);
  });
}).listen();

svrpath/file.html

<!DOCTYPE html>
<html>
  <body>
    <p>Hello World!</p>
    <p>Some more content</p>
  </body>
</html>

Working Example

最佳答案

您的浏览器默认询问 favicon.ico,您对此没有答案,这就是为什么您有未定义的路径(没有这种情况)。您可以添加文件 favicon.ico 并为其创建条件:

function resolveFileName(req){
  var typs = {
    ".html": "text/html",
    ".css": "text/css",
    ".js": "text/javascript"
  };
  if(req === "/"){
    return {
      fname: "./svrpath/file.html",
      type: "text/html"
    };
  }else if(/^.*\.(html|css|js)$/.test(req)){
    return {
      fname: "./svrpath" + req,
      type: typs[req.replace(/^.*(?=\.(html|css|js)$)/, "")]
    };
  }else if(/^.*\/$/.test(req)){
    return {
      fname:"./svrpath" + req.replace(/\/$/, "") + ".html",
      type: "text/html"
    };
  }else if(req === "/favicon.ico"){
      return {
        fname: "./svrpath/favicon.ico",
        type: "image/x-icon"
      }
  }else{
    return "error400";
  }
}

关于javascript - Node.js 查看源代码破坏了文件系统模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49709345/

相关文章:

javascript - 如何绑定(bind)对象以使用普通js更新值?

javascript - 使用 angular.copy 实现 Angular 搜索

javascript - css flex 列自动高度

javascript - 如何使用nodejs从mongodb获取数据并显示为d3图表

node.js - Overnightjs如何启用cors

javascript - 等待链式可观察量完成

javascript - 使用选择框和 url 哈希过滤时 jQuery 同位素问题

android - 页面源与检查

javascript - 添加选项以查看当前 HTML 页面的源代码

html - 为什么我的调试消息没有写入我的页面?