繁体   English   中英

在打字稿节点中从异步等待中获取未定义

[英]getting undefined from async await in typescript node

用例:我正在尝试使用 Node 和 typescript 在 amazon QLDB 中插入一条记录。 我能够成功插入记录/文档,并返回给我 documentID 作为回报。

有 2 个控制器: EntityControllerCommonController -EntityController extends CommonController -EntityController 具有获取 req 对象的代码,将其转换为模型对象,并调用从 CommonController 扩展的 insert() 函数。

问题我试图将该 documentID 一直传播到我的 API 调用,但不知何故我在 EntityController 中未定义。 而我可以在 CommonController 中打印 documentID。

当我明确返回一个值时,我不确定为什么我变得未定义。

const CommonController = require("../template/controller");
import { Request, Response } from 'express';
const tableName:string = "entities";
const EntityModel = require("./model")

class EntityController extends CommonController {
    async insertEntitiy(req:Request,res:Response) {
    async insertEntitiy(req:any,res:any) {
        console.log(req);
        console.log("===========");
        console.log(req.body);
        let entity = new EntityModel();
        entity.balance = req.body.balance;
        entity.firstName = req.body.firstName;
        entity.lastName = req.body.lastName;
        entity.email = req.body.email;
        try {
            let documentIds = await this.insert(tableName,entity);
            console.log("--------- inside insertEntity fiunction()---------");
            console.log(documentIds);
            console.log("------------------");
            res.status(200).send(documentIds[0]);
        } catch (error) {
            console.error(`error in creating Entity: ${error}`);
            res.status(500).send({ errMsg: `error in creating Entity: ${error}` });
        }
    } 
}

module.exports = new EntityController();



import { createQldbWriter, QldbSession, QldbWriter, Result, TransactionExecutor } from "amazon-qldb-driver-nodejs";
import { Reader } from "ion-js";
import { error, log } from "../qldb/LogUtil";
import { getFieldValue, writeValueAsIon } from "../qldb/Util";
import { closeQldbSession, createQldbSession } from "../qldb/ConnectToLedger";

module.exports = class Conroller {
  async insert(tablename:string, object:any): Promise<Array<string>> {
    let session: QldbSession;
    let result:Array<string>;
    try {
        session = await createQldbSession();
        await session.executeLambda(async (txn) => {
            result =  await this.insertDocument(txn,tablename,object);
            console.log("---------result inside insert fiunction()---------");
            console.log(result);
            console.log("------------------");
            return (Promise.resolve(result));
          })
    } catch (e) {
        error(`Unable to insert documents: ${e}`);
        return(["Error"]);
    } finally {
        closeQldbSession(session);
    }
  }

  /**
  * Insert the given list of documents into a table in a single transaction.
  * @param txn The {@linkcode TransactionExecutor} for lambda execute.
  * @param tableName Name of the table to insert documents into.
  * @param documents List of documents to insert.
  * @returns Promise which fulfills with a {@linkcode Result} object.
  */
  async  insertDocument(
    txn: TransactionExecutor,
    tableName: string,
    documents: object
  ): Promise<Array<string>> {
    const statement: string = `INSERT INTO ${tableName} ?`;
    const documentsWriter: QldbWriter = createQldbWriter();
    let documentIds: Array<string> = [];
    writeValueAsIon(documents, documentsWriter);
    let result: Result = await txn.executeInline(statement, [documentsWriter]);
    const listOfDocumentIds: Reader[] = result.getResultList();
    listOfDocumentIds.forEach((reader: Reader, i: number) => {
      documentIds.push(getFieldValue(reader, ["documentId"]));   
    });
    console.log("---------documentIds---------");
    console.log(documentIds);
    console.log("------------------");
    return (documentIds);
  }
}

输出:---------documentIds---------

['4o5UZjMqEdgENqbP9l7Uhz']

---------插入函数()内的结果---------

['4o5UZjMqEdgENqbP9l7Uhz']

--------- 在 insertEntity 函数()中---------

不明确的

正如@daniel-w-strimpel 在评论中指出的那样,您的 insert 方法仅在 catch 部分返回。

尝试这个:

insert(tablename:string, object:any): Promise<Array<string>> {
  let session: QldbSession;
  let result: Array<string>;
  try {
    session = await createQldbSession();
    return session.executeLambda(async (txn) => {
      result = await this.insertDocument(txn,tablename,object);
      console.log("---------result inside insert fiunction()---------");
      console.log(result);
      console.log("------------------");
      return result;
    })
  } catch (e) {
    error(`Unable to insert documents: ${e}`);
    return(["Error"]);
  } finally {
    closeQldbSession(session);
  }
}
...

return session.executeLambda您返回 Promise。

return result; 您返回实际值。

更多关于这里的承诺: https : //pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM