Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 角度,Http post返回对象_Node.js_Angular_Typescript_Http_Post - Fatal编程技术网

Node.js 角度,Http post返回对象

Node.js 角度,Http post返回对象,node.js,angular,typescript,http,post,Node.js,Angular,Typescript,Http,Post,我有一个函数,它可以在我的数据库中找到一个对象,并应该返回它。我在它前面放了一个conse.log,看看它是否是我想要得到的对象,并正常工作 这是我的服务: buscarUsuario(email: string){ return this.http.post(`${URL}/user/email`, email) .subscribe(resp => { //Here i can see the object and works

我有一个函数,它可以在我的数据库中找到一个对象,并应该返回它。我在它前面放了一个conse.log,看看它是否是我想要得到的对象,并正常工作

这是我的服务:

buscarUsuario(email: string){

 return this.http.post(`${URL}/user/email`, email)
          .subscribe(resp => {      
          //Here i can see the object and works      
          console.log(resp['usuario']);
          
          //This return doesn't work
          return resp['usuario'];
          
         }); 
         
  
}

这是我的后端的功能,我在Postman中测试了它,它工作正常:

userRoutes.post('/email', async(req: Request, res: Response) => {

const usuario = await Usuario.findOne({email: req.body.email});

res.json({
    ok: true,
    usuario
});
}))


那么,有人能告诉我如何归还那个物体吗?请:)

您不能从
.subscribe()
方法返回值
.subscribe()
Subscription
返回到相应的
可观察的
。问题是您想要实现什么?

问题是您正在返回一个函数。返回对象的更好方法是使用类似于承诺的东西

比如说

function buscarUsuario(email: string){
  return new Promise((resolve, reject) => {
    this.http.post(`${URL}/user/email`, email)
             .subscribe(resp => {      
             //Here i can see the object and works      
             console.log(resp['usuario']);
             
             resolve(resp['usuario'])
            }); 
  })      
async function test() {
    let usuario = await buscarUsuario(...)
}
现在,您可以通过调用
.then()
或使用
async wait

let usuario = await buscarUsuario(...)
第一种方法

...
buscarUsuario(...)
   .then(usuario => {
         // usuario is your object
   })
   .catch(err => { throw err })
更干净的方法是使用
async
wait

let usuario = await buscarUsuario(...)
请记住,第二种方法是,包含该行的函数必须是
async

比如说

function buscarUsuario(email: string){
  return new Promise((resolve, reject) => {
    this.http.post(`${URL}/user/email`, email)
             .subscribe(resp => {      
             //Here i can see the object and works      
             console.log(resp['usuario']);
             
             resolve(resp['usuario'])
            }); 
  })      
async function test() {
    let usuario = await buscarUsuario(...)
}
编辑

function buscarUsuario(email: string){
    return this.http.post(`${URL}/user/email`, email).toPromise()
}

主要区别在于第二个方法将返回值而不是对象

async function test() {
    let usuario = await buscarUsuario(...)
}

这样的办法应该行得通。尝试一下并让我知道结果

正确的方法是不订阅服务方法,而是返回可观察的:

buscarUsuario(email: string){
  return this.http.post(`${URL}/user/email`, email)
          .pipe(map(resp => resp['usuario']))        
}); 
然后,您可以从任何其他位置(例如您的组件)订阅该方法:

componentMethod() {
  this.myService.buscarUsuario.subscribe(usuario => this.usuario = usuario);
}

那么,我如何返回那个对象呢?这一切都取决于你想对这个对象做什么<代码>可观察
概念基于反应性。因此,您可以创建stream
buscarUsario(email:string){返回this.http.post(
${URL}/user/email
,email)}stream$=buscarUsario('email@email.com“”
此流您可以在模板中使用
async
管道。或者,您可以调用
wait This.http.post(
${URL}/user/email
,email).toPromise()
和grab value。我现在尝试了第二种方法,异步函数,现在在控制台上返回一个null对象。log说null too你是否像我一样用
承诺
包装了这个.http.post
呢?我检查了我的答案,忘了在这里添加引号
resolve(resp[usuario])
应该是
resolve(resp['usuario'])
是的,我以前就知道了,我试过了,但仍然说空。好的,试着
返回这个.http.post(${URL}/user/email),email.toPromise())
确保使用“而不是”