nodejs控制器功能有什么问题?

时间:2021-01-13 10:14:30

标签: javascript

exports.signupController = async (req, res) => { 
const { phone, password } = req.body;
try {
    const user = await User.findOne({ phone }).exec()
    if (user) {
        return res.status(400).json({
            errorMessage: 'Phone Number already exists',
        });
    }

    const newUser = new User();
    newUser.phone = phone;     
    const salt = await bcrypt.genSalt(10);
    newUser.password = await bcrypt.hash(password, salt);
    await newUser.save();    
    return res.status(200).json({
        successMessage: 'Registration success. Please login',
    });    
} catch (err) {
    console.log('signupController error: ', err);
    res.status(500).json({
        errorMessage: 'Server error',
    });
}};

**我在共享主机上传了一个节点应用程序! ** *但此控制器功能中显示错误。 catch 块一直在 json 上运行。错误是未处理的承诺拒绝。 *

 signup(data)
   .then((response) => {
       console.log('Axios signup success: ', response);
       setFormData({
           phone: '',
           password: '',
           password2: '',
           loading: false,
           successMsg: response.data.successMessage,
       });
     history.push('/signin');
   })
   .catch((err) => {
       console.log('Axios signup error: ', err);
       setFormData({
           ...formData,
           loading: false,
           errorMsg: err.response.data.errorMessage,
       });
   });

这是 React 前端事件处理程序

import axios from 'axios';
export const signup = async (data) => {
const config = {
    headers: {
        'Content-Type': 'application/json',
    },
};

const response = await axios.post('/api/auth/signup', data, config);

return response;

};

注册api函数

1 个答案:

答案 0 :(得分:0)

Mongoose 查询不是承诺。为了方便起见,它们有一个用于 co 和 async/await 的 .then() 函数。如果您需要一个成熟的承诺,请使用 .exec() 函数。例如:

const query = Band.findOne({name: "Guns N' Roses"});
assert.ok(!(query instanceof Promise));

// A query is not a fully-fledged promise, but it does have a `.then()`.
query.then(function (doc) {
  // use doc
});

// `.exec()` gives you a fully-fledged promise
const promise = query.exec();
assert.ok(promise instanceof Promise);

promise.then(function (doc) {
  // use doc
});

如果您在 findOne 查询中使用 exec(),则应使用:


exports.signupController = async (req, res) => { 
const { phone, password } = req.body;
try {
     const user = await User.findOne({ phone }).exec();
     /// just a pseudo code

     user.then('do your things').catch( 'log error')
  

    const newUser = new User();
    newUser.phone = phone;     
    const salt = await bcrypt.genSalt(10);
    newUser.password = await bcrypt.hash(password, salt);
    await newUser.save();    
    return res.status(200).json({
        successMessage: 'Registration success. Please login',
    });    
} catch (err) {
    console.log('signupController error: ', err);
    res.status(500).json({
        errorMessage: 'Server error',
    });
}};


有关更多详细信息,请查看:https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html?