执行功能,但抛出错误

时间:2018-01-23 17:50:36

标签: javascript node.js

尝试编写以下代码: 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是函数的实例。这有什么问题?

2 个答案:

答案 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()
    })
}