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

莫希特·古普塔(Mohit Gupta)

用例:我正在尝试使用Node和Typescript在Amazon QLDB内插入一条记录。我能够成功插入记录/文档,并且它返回我的documentID作为回报。

有2个控制器:EntityControllerCommonController -EntityController扩展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);
  }
}

ouptut:--------- documentIds ---------

['4o5UZjMqEdgENqbP9l7Uhz']

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

['4o5UZjMqEdgENqbP9l7Uhz']

---------在insertEntity fiunction()里面---------

未定义

尼科德

正如@ 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您的承诺中返回。

return result;您返回实际值。

有关承诺的更多信息,请访问:https//pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打字稿:无法获取属性“块”的值:对象为null或未定义

来自分类Dev

带有泛型的打字稿中存在问题:无法读取未定义的属性“原型”

来自分类Dev

打字稿中未定义与未分配的变量

来自分类Dev

打字稿.length返回未定义

来自分类Dev

从外部文件在打字稿中声明var获取ReferenceError:...未定义

来自分类Dev

无法从打字稿中获取全局变量?

来自分类Dev

打字稿模块:已定义未定义

来自分类Dev

从打字稿中致电alertifyjs

来自分类Dev

在异步/等待中包装promise

来自分类Dev

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

来自分类Dev

异步/等待-数据未定义

来自分类Dev

异步函数不返回值,但在调用未定义的打字稿后显示

来自分类Dev

从打字稿中的CLI解析文本

来自分类Dev

异步等待获取未定义。怎么处理?

来自分类Dev

在打字稿中引用VSS.SDK。错误:未定义VSS

来自分类Dev

打字稿导入的对象未定义

来自分类Dev

JavaScript:变量在等待中未定义

来自分类Dev

异步/等待问题(返回未定义)

来自分类Dev

“未定义!”在打字稿中是什么意思?

来自分类Dev

在异步/等待中取消线程

来自分类Dev

未定义的NodeJS'toUpperCase'(从打字稿生成)

来自分类Dev

节点异步模块。导出未定义

来自分类Dev

打字稿中未定义的属性

来自分类Dev

无法从打字稿中的 json 对象获取数组响应

来自分类Dev

打字稿中的减法返回未定义

来自分类Dev

在打字稿中创建类时奇怪的未定义?

来自分类Dev

嵌套函数调用中的打字稿异步等待

来自分类Dev

从打字稿中的值获取枚举的键

来自分类Dev

无法从打字稿中的异步方法发出事件

Related 相关文章

热门标签

归档