Ошибка типа: res.sendStatus не является функцией - Почему я продолжаю получать эту ошибку? - PullRequest
0 голосов
/ 12 января 2020

Я работал в Node.js / Express над созданием REST Api в течение последних нескольких месяцев. Я сталкиваюсь с этой проблемой с моей функцией asyn c в моем контроллере. 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

Вот мой контроллер. js file

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)) обратно клиенту, я всегда получаю ошибку. Где я иду не так?

Обновлено: 12 января Также, вот мое приложение. js, чтобы вы могли видеть, как я справляюсь с моими маршрутами. Клиент (на основе моего кода go из 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 голосов
/ 12 января 2020

Похоже, вы неправильно настраиваете свой 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 (если это не то, что вы странным образом намеревались). Технически это можно сделать, но это очень необычно, поэтому мне интересно, действительно ли это то, что вы намеревались.

0 голосов
/ 12 января 2020

Вы неправильно инициализировали 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);
...