RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1407940
Accepted
vegasmoscow
vegasmoscow
Asked:2022-07-09 03:30:21 +0000 UTC2022-07-09 03:30:21 +0000 UTC 2022-07-09 03:30:21 +0000 UTC

如何从外部获取 mysql.query 结果?

  • 772

我正在 node+express 上编写注册/授权 API。在任何情况下,路由/registration都应该返回一个像这样的 json 对象:

{
    "registered": false, // Есть или нет такой email в базе
    "error": false, // Есть ли ошибки валидации
    "message": "" // Пишем сообщение что именно не так
}

在客户端,我会阅读这个答案并做出相应的反应。该对象由以下代码构成:

const express = require('express')
const router = express.Router()
const db = require('./dbConnection')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const { isEmail } = require('./emailValidator.js')

router.post('/registration', (req, res) => {
    const email = req.body.email.toLowerCase()

    // Основа будущего json-объекта с ответом
    let registered = false
    let error = false
    let message = ''

    // Валидация email
    if (email == '') {
        // Если email пустой
        error = true
        message = 'Email is empty'
    } else if (!isEmail(email)) {
        // Если email не корректен
        error = true
        message = 'Email is incorrect'
    }

    // Проверим, существует ли такой email в базе данных
    db.query(`SELECT * FROM users WHERE email = ${db.escape(email)}`, (err, result) => {
        if (result.length) {
            // Если что-то вернулось, значт email уже зарегистрирован
            // Меняем данные ответа
            registered = true
            error = true
            message = 'This email already in use'
            // Проблема здесь. Переменные недоступны снаружи, return не помогает.
        } else {
            // Если email ранее не регистрировался, пишем его в базу
            // registered, error, message остаются дефолтными
        }
    })

    // Возвращаем финальный объект с ответом
    const response = { registered, error, message }
    res.status(200).json(response)
})

在代码中,我写了我无法获取变量的地方,以将它们添加到响应 json 对象中。怎么把它们弄到外面去?

node.js
  • 2 2 个回答
  • 24 Views

2 个回答

  • Voted
  1. Best Answer
    Oliver Patterson
    2022-07-09T03:47:33Z2022-07-09T03:47:33Z

    实际上,您需要将所有内容都包装在一个 Promise 中。

    const express = require('express')
    const router = express.Router()
    const db = require('./dbConnection')
    const bcrypt = require('bcryptjs')
    const jwt = require('jsonwebtoken')
    const { isEmail } = require('./emailValidator.js')
    
    router.post('/registration',  async (req, res) =>
    {
        const email = req.body.email.toLowerCase()
    
        // Основа будущего json-объекта с ответом
        let registered = false
        let error = false
        let message = ''
    
        // Валидация email
        if (email == '')
        {
            // Если email пустой
            error = true
            message = 'Email is empty'
        }
        else if (!isEmail(email))
        {
            // Если email не корректен
            error = true
            message = 'Email is incorrect'
        }
        else
        {
            // Проверим, существует ли такой email в базе данных
            const query = new Promise((resolve, reject) =>
            {
                db.query(`SELECT * FROM users WHERE email = ${db.escape(email)}`, (err, result) =>
                {
                    if (err)
                    {
                        reject(err);
                        return;
                    }
        
                    if (result.length)
                    {
                        // Если что-то вернулось, значт email уже зарегистрирован
                        // Меняем данные ответа
        
                        resolve({registered: true, error: true, message: 'This email already in use'})
                    }
                    else
                    {
                        // Если email ранее не регистрировался, пишем его в базу
                        // registered, error, message остаются дефолтными
                    }
                })
            });
        
            try
            {
                ({registered, error, message}) = await query;
            }
            catch (err)
            {
                console.error(err);
            }
        }
    
        // Возвращаем финальный объект с ответом
        const response = { registered, error, message }
        res.status(200).json(response)
    })

    • 1
  2. vegasmoscow
    2022-07-09T21:00:23Z2022-07-09T21:00:23Z

    原来是通过回调完成的:

    const express = require('express')
    const router = express.Router()
    const db = require('./dbConnection')
    const bcrypt = require('bcryptjs')
    const jwt = require('jsonwebtoken')
    const { isEmail } = require('./emailValidator.js')
    
    router.post('/registration', (req, res) => {
        const email = req.body.email.toLowerCase()
        const password = req.body.password
        let registered = false
        let error = false
        let message = ''
    
        // Validate email
        if (email == '') {
            // Is email empty
            registered = false
            error = true
            message = 'Email is empty'
            res.status(400).json({ registered, error, message })
            return
        } else if (!isEmail(email)) {
            // Is email correct
            registered = false
            error = true
            message = 'Email is incorrect'
            res.status(400).json({ registered, error, message })
            return
        }
    
        // Validate password
        if (password == '') {
            // Is password empty
            registered = false
            error = true
            message = 'Password is empty'
            res.status(400).json({ registered, error, message })
            return
        }
    
        // Register new user
        db.query(`SELECT * FROM users WHERE email = ${db.escape(email)}`, (err, result) => {
            if (result.length) {
                // If email already in use
                registered = false
                error = true
                message = 'Email is already in use'
                res.status(400).json({ registered, error, message })
            } else {
                // Email is available
                bcrypt.hash(password, 10, (err, hash) => {
                    if (err) {
                        // If password not hashed
                        registered = false
                        error = true
                        message = 'Password was not hashed'
                        res.status(500).json({ registered, error, message })
                        return
                    } else {
                        // Add to database email and hashed password
                        db.query(`INSERT INTO users (email, password) VALUES (${db.escape(email)}, ${db.escape(hash)})`, (err, result) => {
                            if (err) {
                                // If query is not success
                                registered = false
                                error = true
                                message = 'Some problems with data base'
                                res.status(500).json({ registered, error, message })
                                return
                            } else {
                                registered = true
                                error = false
                                message = 'New user creted'
                                res.status(200).json({ registered, error, message })
                                return
                            }
                        })
                    }
                })
            }
        })
    })
    
    • 0

相关问题

  • 通过掩码 node.js 指定字符串

  • 从节点 js 发布请求声明变量

  • 为什么 BigQuery 查询如此缓慢?

  • 在 Elasticsearch 中使用 Fluentd 进行映射

  • 如何设置 vuejs 和 nodejs 以使用 mssql

  • 如何添加对象而不覆盖它?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5