尝试编写以下代码: index.js
const http = require('http');
const port = 9090;
const url = require('url');
const handlers = require('./handlers.js');
http.createServer((req, res) => {
req.path = url.parse(req.url).pathname;
let handler = handlers(req.path);
handler(req, res);
}).listen(port);
handlers.js:
const fs = require('fs');
const homeHandler = require('./handlers/home-handler');
const contentHandler = require('./handlers/content-handler');
module.exports = (path) => {
switch (path) {
case '/':
return homeHandler;
case '/content':
return contentHandler;
}
}
主-handler.js
const fs = require('fs')
module.exports = (req, res) => {
fs.readFile('./index.html', (err, data) => {
if (err) {
console.log(err.message);
return;
}
res.writeHead(200, {
'content-type': 'text/html'
});
res.write(data);
res.end();
return;
});
};
当我"启动计划"并在浏览器localhost:9090
中运行,函数处理程序在浏览器中执行,但在调试控制台中它会抛出:
TypeError:handler不是函数
使用console.log(handler)
表示handler
是函数,instanceof
表示handler
是函数的实例。这有什么问题?
答案 0 :(得分:1)
您的handlers
函数仅处理两个特定输入/
和/content
。任何其他请求都会产生错误,因为handlers
不会返回函数。
你可能会说,“那很好!我不请求在两条路径之外的路径,”但我认为你可能错了。
大多数浏览器会通过请求/favicon.ico
添加来请求您输入的实际网址来请求图标。如果浏览器执行此额外的图标请求,将看到您想要的请求的成功结果(如您所示),但也会看到附加的favicon请求的失败消息,您尚未设置要处理的代码。
我建议添加一个默认的调试处理程序:
module.exports = (path) => {
switch (path) {
case '/':
return homeHandler;
case '/content':
return contentHandler;
default:
(req, res) => {
res.end("Path not handled");
console.warn("No handler for", req.url);
}
}
}
答案 1 :(得分:0)
const fs = require('fs')
const faviconIco = '/favicon.ico'
module.exports = (req, res) => {
fs.readFile('.' + faviconIco, (err, data) => {
if (err) {
console.log(err.message)
return
}
res.writeHead(200, {
'content-type': 'image/x-icon'
})
res.write(data)
res.end()
})
}