Попытка отправить POST-ответ с помощью Node Express, ошибка Неверный код состояния - PullRequest
0 голосов
/ 11 января 2019

После завершения регистрации появляется следующая ошибка при попытке ответить на POST-запрос. (хотя пользователь успешно добавлен в базу данных)

express deprecated res.send(status, body): Use res.status(status).send(body) 
instead auth\registrator.js:31:29
D:\startloop\server\node_modules\mysql\lib\protocol\Parser.js:80
        throw err; // Rethrow non-MySQL errors
        ^

RangeError: Invalid status code: [object Object]
    at ServerResponse.writeHead (_http_server.js:199:11)
    at ServerResponse.writeHead (D:\startloop\server\node_modules\on-headers\index.js:55:19)
    at ServerResponse._implicitHeader (_http_server.js:190:8)
    at write_ (_http_outgoing.js:632:9)
    at ServerResponse.end (_http_outgoing.js:751:5)
    at ServerResponse.send (D:\startloop\server\node_modules\express\lib\response.js:221:10)
    at ServerResponse.json (D:\startloop\server\node_modules\express\lib\response.js:267:15)
    at ServerResponse.send (D:\startloop\server\node_modules\express\lib\response.js:158:21)
    at Query.db.query (D:\startloop\server\auth\registrator.js:31:29)
    at Query.<anonymous> (D:\startloop\server\node_modules\mysql\lib\Connection.js:502:10)

index.js (inpoints)

// Middlewares
const express = require('express')
const morgan = require('morgan')
const cors = require('cors')
const bodyParser = require('body-parser')
const validator = require('express-validator')
const registrator = require('./auth/registrator')
const status = require('./appstatus/status')
require('dotenv').config();

// New express app
const app = express()
app.use(morgan('tiny'))
app.use(cors())
app.use(bodyParser.json())
app.use(validator())

// Status GET
app.get('/status', status.getStatus)

// Register POST
app.post('/auth/reg', registrator.register)

// Express.js listen
const port = process.env.PORT || 3362
app.listen(port, () => {
    console.log(`On port ${port}`)
})

registrator.js

// Registrator
// Requires request and response

const validator = require('./validator')
const bcrypt = require('bcrypt')

exports.register = function(req, res) {
    const valErr = validator.registrationValidator(req)

    if (valErr) {
        console.log(`Validation Error: ${JSON.stringify(valErr)}`)
        res.status(200).send([{well: 'no'} ,valErr])
        throw valErr
    }

    const db = require('../modules/database')
    const username = req.body.username
    const fname = req.body.fname
    const lname = req.body.lname
    const email = req.body.email
    const password = req.body.password

    // Hash Password
    bcrypt.hash(password, 10, (err, hash) => {
        if (err) throw err
        db.query('INSERT INTO users (username, email, password_hash, first_name, last_name) VALUES (?, ?, ?, ?, ?)', [username, email, hash, fname, lname], (err, result) => {
            if (err) {
                res.send(err)
                throw err
            }
            res.status(200).send({well: 'yes'} ,result)
        })
    })

    return 0
}

Это похоже на проблему с MySQL. Попытка отправить valErr работает, но попытка отправить ответ регистрации не дает. Примечание. Запрос выполнен успешно.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Обратите внимание на первую строку вашей ошибки

экспресс устаревший res.send (статус, тело): использовать res.status (статус) .send (тело)

Ваша проблема здесь

db.query('INSERT INTO users (username, email, password_hash, first_name, last_name) VALUES (?, ?, ?, ?, ?)', [username, email, hash, fname, lname], (err, result) => {
            if (err) {
                res.send(err)
                throw err
            }
            res.status(200).send({well: 'yes'} ,result)
        })

Поскольку ваша ошибка сообщает res.send(status, body) устарела, вы делаете: res.send (ERR)

Он интерпретирует err как код состояния (это не так);

Измените это на

res.status(500).send(err); 

Для более значимой ошибки.

0 голосов
/ 11 января 2019

Хорошо, ребята. После тщательной проверки я забыл поместить данные ответа в массив, подобный этому

res.status(200).send([{well: 'yes'}, result])

Damit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...