【问题标题】:TypeError: res.sendStatus is not a function - Why do I keep getting this error?TypeError: res.sendStatus is not a function - 为什么我不断收到此错误?
【发布时间】:2020-01-11 23:24:37
【问题描述】:

在过去的几个月里,我一直在 Node.js/Express 中制作 REST Api。我的 controller.js 文件中的异步函数遇到了这个问题。我的回调函数从客户端接收我的request,但是当我想发送response 时,我不断收到TypeError: res.sendStatus is not a function 错误。

这是我的代码:

index.js

const express = require('express');
const { parseData } = require("../controllers/parse.controller");
const { checkFirebaseLogin } = require("../controllers/checkFirebaseLogin.controller");
var bodyParser = require('body-parser');
var router = express.Router();

router.use(bodyParser.json());  
router.use(bodyParser.urlencoded({ extended: false }));

router.post('/api/idToken', checkFirebaseLogin);
router.post('/', parseData);

module.exports = router

这是我的 Controller.js 文件

checkFirebaseLogin.controller.js

const { checkUserLogin } = require("../services/checkUserLogin.service");

const checkFirebaseLogin = async (req, res) => {
    console.log("Checking on user token ...");
    const userToken = req.headers;

    try {
        var userUID = await checkUserLogin(userToken);
        console.log("Here's the repsonse:");
        console.log(userUID)
        res.sendStatus(201)
    } catch (error) {
        console.log("I'm here right before the error message on checking the user token")
        //console.log(error.message);
        console.log(error)
    }

};

module.exports = {
    checkFirebaseLogin
};

我能够获得req.headers,但是当我尝试将响应(通过res.sendStatus(200))发送回客户端时,我总是收到错误消息。我哪里出错了?

更新时间:1 月 12 日 另外,这里是我的 app.js,这样你就可以看到我是如何处理我的路线的。客户端(基于我的代码将来自app.js -> routes/index.js -> controllers/checkFirebaseLogin.controller.js)

app.js

var express = require('express');
var http = require("http");
var app = express();
const routes = require('./routers');

//app.get('/', (req, res) => res.send('App is working'));

app.use('/', routes);
app.use('/api/idToken', routes);

http.createServer(routes).listen(5000, () => {
    console.log("server up");
});

module.exports = {
    app
};

【问题讨论】:

  • 你确定它会扔进那个代码吗?显示完整的堆栈跟踪。因为可以抛出错误的唯一方法是res 不是 Express Response 对象。
  • 通常,当您不小心将一些其他局部变量(通常是回调参数)定义为 res 并且它覆盖了传递给请求处理程序的 res 时,就会发生此错误。然后,当您尝试调用 res.sendStatus() 时,这是错误的 res 对象。您没有在此处显示,但看起来此代码不会导致该错误,因此我怀疑您未向我们显示的其他一些代码会导致此错误。
  • 注意:单独的问题,但您还需要在 catch 处理程序中发送一些状态/响应。
  • @jfriend00 您还需要查看哪些其他代码?我的 app.js?
  • 我建议您在res.sendStatus(201); 之前添加一个console.log("Before", typeof res.sendStatus, res);,在res.sendStatus(201) 之后添加一个console.log("After");。这里三球。首先,查看res.sendStatus 是否是一个函数,查看res 是否是您期望的对象,然后查看第二个对象是否确实发生了错误,然后再进入第二个控制台消息以查看这是否是实际上发生错误的地方。

标签: javascript node.js rest express


【解决方案1】:

看来您没有正确设置 http 服务器和 Express app 对象。您正在尝试将 router 传递给普通的 http 服务器 - 这是行不通的。您需要将路由器传递给app.use()。

从此改变:

var express = require('express');
var http = require("http");
var app = express();
const routes = require('./routers');

//app.get('/', (req, res) => res.send('App is working'));

app.use('/', routes);
app.use('/api/idToken', routes);

http.createServer(routes).listen(5000, () => {
    console.log("server up");
});

module.exports = {
    app
};

到这里:

var express = require('express');
var app = express();
const routes = require('./routers');

//app.get('/', (req, res) => res.send('App is working'));

app.use('/', routes);
app.use('/api/idToken', routes);

app.listen(5000, () => {
    console.log("server up");
});

module.exports = {
    app
};

这里的关键是app 对象,而不是router 对象需要传递给http 服务器。在此修改后的代码中,我们使用app.listen() 创建自动为我们执行此操作的服务器。在您的原始代码中,您可以这样做:

http.createServer(app).listen(...) 

注意传递app,而不是router。但是,我更喜欢只使用app.listen(),它被设计为一个编码快捷方式(它为你创建了 http 服务器对象)。

另外,这看起来很可疑:

app.use('/', routes);
app.use('/api/idToken', routes);

因为您要让完全相同的功能出现在两个不同的 URL 位置(除非这是您奇怪的意图)。从技术上讲,您可以这样做,但这是非常不寻常的,所以我想知道这是否真的是您的意图。

【讨论】:

  • 我正在运行最新版本的 Express (4.17.1),我尝试了 res.status(201).send('Created');。然而这并没有奏效。我已将我的 app.js 添加到原始问题中,因为您想看看我如何将路由器连接到我的 express 应用程序中`
  • @jeff-ridgeway - 好的,终于可以看到一个大问题了。我重写了我的答案。
  • 成功了!稍后我还将更改看起来可疑的路线。谢谢!
  • @jeff-ridgeway - 太棒了。只需要查看代码的其他部分。
【解决方案2】:

你没有正确初始化 express。

var app = express();
...
var router = express.Router();
app.use(bodyParser.json());  
app.use(bodyParser.urlencoded({ extended: false }));

router.post('/api/idToken', checkFirebaseLogin);
router.post('/', parseData);
...
app.use(router);

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2022-10-07
    • 2014-10-06
    • 2020-09-13
    • 2022-06-22
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多