MySQL XDevAPI 如何返回成功状态

Posted

技术标签:

【中文标题】MySQL XDevAPI 如何返回成功状态【英文标题】:MySQL XDevAPI How to return a successful status 【发布时间】:2020-07-11 18:25:37 【问题描述】:

使用与 mysql 对话的 XDEVAPI 开发我的 RestAPI。这段代码用于添加新记录,

myRecord.add = (newmyRecord, res) =>

    mysql.getSession(mydb)      // .getSession() is a Promise, returns a session
        .then
        (
            sess =>
            
                sess.getSchema("myschema").getTable("mytable").insert(...).execute(row=>console.log('inserted')); 
                
                res.send(200);   // resulting "UnhandledPromiseRejectionWarning: TypeError: res.send is not a function"
                //return 200;    // Postman still shows "Sending" and Fiddler does not show status 200
            
            
        );

所以我的问题是如何发送成功的 200 来完成 POST?

【问题讨论】:

【参考方案1】:

execute() 方法还返回一个Promise,对于insert(),它不期待任何类型的回调,因此永远不会调用以下行:

console.log('inserted')

execute() 期望回调的唯一实例是 TableSelectCollectionFind。而且我们正在慢慢摆脱这种 API 风格,因为现在您还可以通过在 Result 解析为的 Result 实例上调用 fetchOne()fetchAll() 来处理结果集(参见 DocResult 和 @ 987654325@)。

在任何情况下,没有什么可以阻止 res.send(200) 调用的发生,也没有什么隐式更改底层 HTTP 框架(您似乎正在使用)的 API。因此,您提到的问题似乎与 MySQL X DevAPI 连接器无关。

TypeError: res.send is not a function

您可能在调用 res 对象之前(以及在调用 add() 之前)覆盖了它。

这可能没什么帮助,但这是我现在可以从您的帖子中提取的唯一内容。

免责声明:我是 MySQL X DevAPI Connector for Node.js 的首席开发人员

【讨论】:

虽然没有提供解决方案,但非常感谢详细的解释!我找到了解决方案:1)将res替换为result,即myRecord.add = (newmyRecord, res)变为myRecord.add = (newmyRecord, result)。 2) 用result(null); 替换res.send(200); 不太清楚为什么,但效果很好。 其实不用替换res,但是res(null)可以工作。 一个后续问题,.insert() 应该返回一个execute() → Promise.<module:Result>,因此根据文档它返回行数,其他类似getAffectedItemsCount()。但是 Watch 没有显示任何可用的。 不确定我是否在关注。如果插入一行然后result.getAffectedItemsCount() 返回1(在操作范围内插入的行数),它不会返回表中存在的总行数。 学习后,我确实覆盖了 res.好建议!

以上是关于MySQL XDevAPI 如何返回成功状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 mysql xdevapi 设置 DateTime

mysql-xdevapi getCollections 承诺返回值

mysql xdevapi nodejs:返回插入的行auto_increment id

XDevApi 如何发回 .insert() 的结果

MYSQL XDEVAPI 多或(二)请求

使用 Mysql xdevapi