Node.js 为什么我的Axios承诺不会按预期分配对象?

Node.js 为什么我的Axios承诺不会按预期分配对象?,node.js,post,promise,request,axios,Node.js,Post,Promise,Request,Axios,我对这个比较陌生,不明白为什么会发生这个错误。我试图调用axios post请求来访问数据库并允许用户登录,但承诺没有按预期执行。它将访问数据库并返回一个对象,但每当我尝试分配下面的“result”时,它都会说result仍然是一个空对象,里面有一个_proto___________)对象,即使console.log(result)会打印出我想要的数据。如何将所需的数据输入到“result”对象中,而不只是一个空变量 我已在此处附上我的代码: const userlogin =

我对这个比较陌生,不明白为什么会发生这个错误。我试图调用axios post请求来访问数据库并允许用户登录,但承诺没有按预期执行。它将访问数据库并返回一个对象,但每当我尝试分配下面的“result”时,它都会说result仍然是一个空对象,里面有一个_proto___________)对象,即使console.log(result)会打印出我想要的数据。如何将所需的数据输入到“result”对象中,而不只是一个空变量

我已在此处附上我的代码:

        const userlogin = {
            company: this.state.company,
            email: this.state.email,
            password: this.state.password            
        }
        let result = {}
        axios.post('http://localhost:5000/login', userlogin)
            .then(res => {
                console.log(res.data[0])
                result = res.data[0]
            })
            .catch(res => {
                console.log("Failed")
            })
        
        console.log(result)
        window.location = '/'
Printing res.data[0]精确地打印我想要的内容,但当我将其指定给结果和打印结果时,它会显示一个带有_proto__的空对象。 我已经为此挣扎了一段时间,如果有任何帮助,我将不胜感激!非常感谢你

axios.post().then()
是非阻塞和异步的。这意味着将启动
axios
请求,然后在其运行后删除代码(包括
console.log()
)。然后,一段时间后,axios操作完成,promise解析,然后调用
。然后()
处理程序

因此,您的
console.log(result)
会在分配值之前运行。对
.then()
的回调稍后会被调用,因此您试图在分配
结果之前查看它


正确的解决方案是在
处理程序中使用
结果
。然后()
处理程序或从那里调用某个函数,并将值传递给该函数。您无法在
.then()
处理程序之外可靠地使用该值,因为您不知道它实际上是何时设置的。

这就完成了您所描述的内容

//使用async/await(现代语法)
常量myFunc=async()=>{
试一试{
const userlogin={
公司:这个州的公司,
电子邮件:this.state.email,
密码:this.state.password
}
让结果={}
const res=等待axios.post('http://localhost:5000/login,用户登录名)
console.log(res.data[0])
结果=分辨率数据[0]
console.log(结果)
window.location='/'
}捕捉(错误){
console.log('失败')
}
}
//使用嵌套语法(旧语法)
常量myFunc2=()=>{
const userlogin={
公司:这个州的公司,
电子邮件:this.state.email,
密码:this.state.password
}
让结果={}
轴心柱http://localhost:5000/login,用户登录名)
。然后(res=>{
console.log(res.data[0])
结果=分辨率数据[0]
console.log(结果)
window.location='/'
})
.catch(错误=>{
console.log(“失败”)
})
}

主要问题是axios会返回一个承诺,因此任何未嵌套在
中的内容都会立即执行。使用现代语法可以更容易地知道我们正在等待来自目标的响应。使用较旧的语法可能会令人困惑,尤其是当有多个对后端的请求必须执行时。

上面@ggorlen链接的问题的第一个答案描述了您遇到的问题以及如何解决它。