Javascript 异步函数不返回json对象 公共异步validateToken(req,res):承诺{ const token=req.headers.authorization.split(“”[1]| | req.params.token; 等待这个.redisClient.SISMEMBER(“tokenBlackListSet”、token、函数( 犯错误 数据 ) { 如果(data){//这里我得到data=1,因为tokenBlackListSet中存在token return{//,所以应该以json的形式返回 现状:400, 错误:“无效令牌” }; } }); } //在其他异步函数中 const response=等待验证(req,res); console.log(response)//返回值始终未定义

Javascript 异步函数不返回json对象 公共异步validateToken(req,res):承诺{ const token=req.headers.authorization.split(“”[1]| | req.params.token; 等待这个.redisClient.SISMEMBER(“tokenBlackListSet”、token、函数( 犯错误 数据 ) { 如果(data){//这里我得到data=1,因为tokenBlackListSet中存在token return{//,所以应该以json的形式返回 现状:400, 错误:“无效令牌” }; } }); } //在其他异步函数中 const response=等待验证(req,res); console.log(response)//返回值始终未定义,javascript,node.js,redis,Javascript,Node.js,Redis,创建一个Promise对象,并从回调内部解析它 public async validateToken(req, res): Promise<any> { const token = req.headers.authorization.split(" ")[1] || req.params.token; await this.redisClient.SISMEMBER("tokenBlackListSet", token, function( err,

创建一个
Promise
对象,并从回调内部解析它

public async validateToken(req, res): Promise<any> {

    const token = req.headers.authorization.split(" ")[1] || req.params.token;
    await this.redisClient.SISMEMBER("tokenBlackListSet", token, function(
        err,
        data
      ) {
        if (data) { // here i get data=1 as token is present in tokenBlackListSet
          return {  // so this  should be returned as json
            status: 400,
            error: "Invalid Token"
          };
        }
      });

}



// in other async function

const response = await validateToken(req,res);

console.log(response) // returned value is always undefined
公共异步validateToken(req,res):承诺{ 让我们重新调用,重新调用 const returnPromise=新承诺((解决、拒绝)=>{ 重新调用=解析 refCallback=拒绝 }) const token=req.headers.authorization.split(“”[1]| | req.params.token; 等待这个.redisClient.SISMEMBER(“tokenBlackListSet”、token、函数( 犯错误 数据 ) { 如果(data){//这里我得到data=1,因为tokenBlackListSet中存在token resCallback({//),所以这应该作为json返回 现状:400, 错误:“无效令牌” }); } }); 回报承诺 }
创建一个
Promise
对象,并从回调内部解析它

public async validateToken(req, res): Promise<any> {

    const token = req.headers.authorization.split(" ")[1] || req.params.token;
    await this.redisClient.SISMEMBER("tokenBlackListSet", token, function(
        err,
        data
      ) {
        if (data) { // here i get data=1 as token is present in tokenBlackListSet
          return {  // so this  should be returned as json
            status: 400,
            error: "Invalid Token"
          };
        }
      });

}



// in other async function

const response = await validateToken(req,res);

console.log(response) // returned value is always undefined
公共异步validateToken(req,res):承诺{ 让我们重新调用,重新调用 const returnPromise=新承诺((解决、拒绝)=>{ 重新调用=解析 refCallback=拒绝 }) const token=req.headers.authorization.split(“”[1]| | req.params.token; 等待这个.redisClient.SISMEMBER(“tokenBlackListSet”、token、函数( 犯错误 数据 ) { 如果(data){//这里我得到data=1,因为tokenBlackListSet中存在token resCallback({//),所以这应该作为json返回 现状:400, 错误:“无效令牌” }); } }); 回报承诺 } 希望这能奏效

public async validateToken(req, res): Promise<any> {

 let resCallback, rejCallback

 const returnPromise = new Promise((resolve, reject) => {
    resCallback = resolve
    refCallback = reject
 })

 const token = req.headers.authorization.split(" ")[1] || req.params.token;
 await this.redisClient.SISMEMBER("tokenBlackListSet", token, function(
    err,
    data
  ) {
    if (data) { // here i get data=1 as token is present in tokenBlackListSet
      resCallback({  // so this  should be returned as json
        status: 400,
        error: "Invalid Token"
      });
    }
  });

 return retPromise
}
公共异步validateToken(req,res):承诺{ const token=req.headers.authorization.split(“”[1]| | req.params.token; return wait this.redisClient.SISMEMBER(“tokenBlackListSet”,token,(err,data)=>{ if(err){抛出新错误(err)} 否则返回{状态:400,错误:“无效令牌”}; } }); } 希望这能奏效

public async validateToken(req, res): Promise<any> {

 let resCallback, rejCallback

 const returnPromise = new Promise((resolve, reject) => {
    resCallback = resolve
    refCallback = reject
 })

 const token = req.headers.authorization.split(" ")[1] || req.params.token;
 await this.redisClient.SISMEMBER("tokenBlackListSet", token, function(
    err,
    data
  ) {
    if (data) { // here i get data=1 as token is present in tokenBlackListSet
      resCallback({  // so this  should be returned as json
        status: 400,
        error: "Invalid Token"
      });
    }
  });

 return retPromise
}
公共异步validateToken(req,res):承诺{ const token=req.headers.authorization.split(“”[1]| | req.params.token; return wait this.redisClient.SISMEMBER(“tokenBlackListSet”,token,(err,data)=>{ if(err){抛出新错误(err)} 否则返回{状态:400,错误:“无效令牌”}; } }); }
由于
SISMEMBER
方法返回的是布尔值,而不是回调返回的值,因此可以返回在回调中解析的新承诺:

public async validateToken(req, res): Promise<any> {

const token = req.headers.authorization.split(" ")[1] || req.params.token;
return await this.redisClient.SISMEMBER("tokenBlackListSet", token, (err,data)=> {
    if (err) { throw new Error(err) }
    else return { status: 400,error: "Invalid Token"};
    }
  });
}
公共异步validateToken(req,res):承诺{ const token=req.headers.authorization.split(“”[1]| | req.params.token; returnnewpromise(函数(resolve,reject){//这里我创建了一个新的Promise,它将在调用回调时解析(或拒绝) this.redisClient.SISMEMBER(“tokenBlackListSet”),token,函数( 犯错误 数据 ) { 如果有错误,我们拒绝承诺 拒绝(错误); } 否则,如果(data){//如果您有一些数据,承诺将与对象解析 决心({ 现状:400, 错误:“无效令牌” }); } }); } }
请注意,我删除了
wait
,因为它现在与我们已经返回承诺的事实是多余的。

因为
SISMEMBER
方法返回的是布尔值,而不是回调返回的值,所以您可以返回在回调中解析的新承诺:

public async validateToken(req, res): Promise<any> {

const token = req.headers.authorization.split(" ")[1] || req.params.token;
return await this.redisClient.SISMEMBER("tokenBlackListSet", token, (err,data)=> {
    if (err) { throw new Error(err) }
    else return { status: 400,error: "Invalid Token"};
    }
  });
}
公共异步validateToken(req,res):承诺{ const token=req.headers.authorization.split(“”[1]| | req.params.token; returnnewpromise(函数(resolve,reject){//这里我创建了一个新的Promise,它将在调用回调时解析(或拒绝) this.redisClient.SISMEMBER(“tokenBlackListSet”),token,函数( 犯错误 数据 ) { 如果有错误,我们拒绝承诺 拒绝(错误); } 否则,如果(data){//如果您有一些数据,承诺将与对象解析 决心({ 现状:400, 错误:“无效令牌” }); } }); } }
请注意,我删除了
wait
,因为它现在与我们已经返回承诺的事实是多余的。

我认为
this.redisClient.SISMEMBER
不会将您的回调结果包装为承诺。如果是这样的话,您不会在这里提问

此时,由于回调结果没有作为返回值传递,因此您的结果将丢失在void中

将函数包装为承诺,并在库调用回调时解析或拒绝它:

public async validateToken(req, res): Promise<any> {

  const token = req.headers.authorization.split(" ")[1] || req.params.token;

  return new Promise(function (resolve, reject) { // Here I create a new Promise that will resolve (or reject) when your callback is called
    this.redisClient.SISMEMBER("tokenBlackListSet", token, function(
      err,
      data
    ) {
      if (err) { // If there is an error, we reject the promise
        reject(err);
      }
      else if (data) { // If you have some data, the promise will resolve with the object
        resolve({
          status: 400,
          error: "Invalid Token"
        });
      }
    });

  }

}

Wait getSISMember()
现在应该会出错或给您JSON响应

我认为
this.redisClient.SISMEMBER
不会将您的回调结果包装为承诺。如果是这样的话,您就不会在这里提问了

此时,由于回调结果没有作为返回值传递,因此您的结果将丢失在void中

将函数包装为承诺,并在库调用回调时解析或拒绝它:

public async validateToken(req, res): Promise<any> {

  const token = req.headers.authorization.split(" ")[1] || req.params.token;

  return new Promise(function (resolve, reject) { // Here I create a new Promise that will resolve (or reject) when your callback is called
    this.redisClient.SISMEMBER("tokenBlackListSet", token, function(
      err,
      data
    ) {
      if (err) { // If there is an error, we reject the promise
        reject(err);
      }
      else if (data) { // If you have some data, the promise will resolve with the object
        resolve({
          status: 400,
          error: "Invalid Token"
        });
      }
    });

  }

}

Wait getSISMember()
现在应该会出错或给您JSON响应

validateToken
没有
返回
语句如果我想从redisClient返回怎么办。SISMEMBER的回调函数然后您需要返回在回调中解析的承诺(在resolve方法调用中使用您的对象作为参数)我按照您的建议进行了更改,但仍然无法重新运行