TypeError:res.sendStatus不是一个函数-为什么我不断收到此错误?

时间:2020-01-11 23:24:37

标签: javascript node.js rest express

在过去的几个月中,我一直在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
};

2 个答案:

答案 0 :(得分:0)

看来您没有正确设置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位置使用完全相同的功能(除非您很奇怪地打算这样做)。您可以从技术上做到这一点,但这是非常不寻常的,所以我想知道这是否真的是您想要的。

答案 1 :(得分:-1)

您没有正确初始化快递。

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);