如何处理 Node.js 中基于 Promise 的业务级函数中的错误返回对象?

2023-12-19

我需要创建一个名为“getLocationById”的业务级函数,它通过 REST API 从远程服务器检索一些数据。然后路由器调用该函数以在网页上显示数据。

如果 fetch 调用成功,则将 json 结果作为 Promise 返回。但是,如果 fetch 捕获错误,应该返回什么给路由器,例如远程服务器没有响应或响应时出现 500 错误?

此外,路由如何响应错误?

const fetch = require('node-fetch');    
const p_conf = require('../parse_config');  // Configuration

const db = {
    getLocationById: function(locId) {
        fetch(`${p_conf.SERVER_URL}/parse` + '/classes/location', { method: 'GET', headers: {
            'X-Parse-Application-Id': p_conf.APP_ID,
            'X-Parse-REST-API-Key': p_conf.REST_API_KEY
        }})
        .then(res1 => return res1.json())  // RETURN A PROMISE ON SUCCESS
        .catch((error) => {
            console.log(error);
            **WHAT TO RETURN TO THE ROUTER ON ERROR HERE?**
        });
    }
};

EDIT:

const db_location = {
    getLocations: function() {
        //res.send("respond with 'locations' router.");
        fetch(`${p_conf.SERVER_URL}/parse` + '/classes/GCUR_LOCATION', { method: 'GET', headers: {
            'X-Parse-Application-Id': p_conf.APP_ID,
            'X-Parse-REST-API-Key': p_conf.REST_API_KEY
        }})
        .then(res1 => res1)
        .catch((error) => {
            console.log(error);
            return Promise.reject(new Error(error));
        })
    }
};

在路由器中:

router.get('/', function(req, res, next) {
  db_location.getLocations()
  .then(r => res.send(r.json()))      // WHERE AN ERROR WAS THROWN
  .catch((err) => {
    console.log(err);
    return next(err);
  })
});

抛出以下错误:

TypeError: Cannot read property 'then' of undefined

on .then(r => res.send(r.json()))

进一步编辑:

然后我做了以下更改。

业务层

getLocations: function() {
    // According to node-fetch documentation, fetch returns a Promise object.
    return fetch(`${p_conf.SERVER_URL}/parse` + '/classes/GCUR_LOCATION', { method: 'GET', headers: {
        'X-Parse-Application-Id': p_conf.APP_ID,
        'X-Parse-REST-API-Key': p_conf.REST_API_KEY
      } });

}

路由器端:

router.get('/', function(req, res, next) {
   db_location.getLocations()
  .then(r => {
    console.log("r.json(): " + r.json());
    res.send(r.json())})
  .catch((err) => {
    console.log(err);
    return next(err);
  })  
});

然后又抛出了一个新的错误:

(node:10184) UnhandledPromiseRejectionWarning: TypeError: body used already for: http://localhost:1337/parse/classes/GCU
R_LOCATION
    at Response.consumeBody (C:\Work\tmp\node_modules\node-fetch\lib\index.js:326:30)
    at Response.json (C:\Work\tmp\node_modules\node-fetch\lib\index.js:250:22)
    at db_location.getLocations.then.r (C:\Work\tmp\ExpressApps\express-parse-server\routes\locations.js:30:13)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:228:7)
(node:10184) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing ins
ide of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejectio
n id: 5)
(node:10184) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejection
s that are not handled will terminate the Node.js process with a non-zero exit code.

我相信 fetch 函数返回了一个 Promise 对象,调用函数可以从路由接收该对象?


您的新编辑即将完成!首先我们要澄清一下大家的一个误解fetch https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch。非 OK 响应不会导致 fetch Promise 被拒绝。为了确定呼叫是否有成功响应,请检查响应.ok https://developer.mozilla.org/en-US/docs/Web/API/Response/ok.

接下来我们需要调查json https://developer.mozilla.org/en-US/docs/Web/API/Body/json方法。查看文档,我们发现它还返回一个 Promise,而不是 JSON。

这是更接近您正在寻找的路由器版本:

router.get('/', function(req, res, next) {
   db_location.getLocations()
   .then(r => {
        if (r.ok) { return r.json(); }
        throw 'Something went wrong!';
    })
   .then(data => res.json(data))
   .catch((err) => {
        console.log(err);
        next(err);
    })  
});

我认为你正在学习 Promise 真是太好了。一旦你对承诺感到满意,就退房异步/等待 https://javascript.info/async-await。它将使您的代码更易于阅读,但了解 Promise 很重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 Node.js 中基于 Promise 的业务级函数中的错误返回对象? 的相关文章

  • node_redis CONFIG SET 命令

    我目前正在使用 redis 编写一个应用程序 但我遇到了 node redis 库的问题 特别是我无法弄清楚如何从 node redis 中使用 redis 命令 我已经尝试了以下所有 client send command CONFIG
  • Google 饼图未显示所有数据行

    我正在尝试绘制人口与国家名称的关系图 我发现 Google 可视化库仅渲染前几个 实际上数字似乎是随机的 具体取决于我使用的数据 有时添加 其他 条目 但它没有t 实际上具有其余条目的值 Example 1 With all countri
  • 通知用户消息仍在输入中

    我正在使用 Laravel 5 6 7 Socket IO 和 vue js 我没有使用 Pusher 和 redis 下面是我的代码 用于向与我一对一聊天的用户发送消息 var url http localhost 6001 apps M
  • 零作为 IIFE 中的第一个参数[重复]

    这个问题在这里已经有答案了 In babeljs v6 5 1 class Foo 编译为 use strict var classCallCheck2 require babel runtime helpers classCallChec
  • 如何在 Node.js 中让一个 EventEmitter 监听另一个 EventEmitter?

    我想做这样的事情 var events require events var emitterA new events EventEmitter var emitterB new events EventEmitter emitterA ad
  • 是否可以将反应组件导出为非反应项目中的函数

    有没有办法在非 React 项目中将 React 组件导出为函数并传入 props 作为函数的参数 我最近用 create react app 完成了一个 React 项目 现在我想将它用于其他非 React 项目 纯 Javascript
  • JQuery DataTable 单元格从行单击

    我正在尝试在 jquery 数据表上实现一个函数 该函数返回单击行的第一列和第四列 我正在遵循这个示例 它允许我操作单击的行http datatables net examples api select single row html ht
  • 点击问题:动态生成的链接不触发点击功能

    下面是两个代码片段 由于某种原因什么也没有发生 但来自同一个 JS 文件的其他 jQuery 函数在带有 UL 的页面上执行得很好 这是在盯着我看吗 ul class paganation li 1 li li a href 2 a li
  • ReactJS:从没有 onChange 事件的 props 中选择默认值?

    所以 我只是想知道我是否绝对需要在 React 中的选择组件上有一个 onChange 事件处理程序 我有一个道具传递我想要选择的选项的默认值 如果我有的话 它就没有问题
  • Chrome Javascript 调试器暂停时不会重新加载页面

    有时 当我在 Chrome 中调试某些 javascript 并且暂停了 javascript 时 如果我尝试重新加载页面 chrome 只会 继续 调试器 单步执行到下一个断点 似乎没有任何方法可以强制 javascript 完全停止运行
  • setInterval 内的返回值

    我想在 setInterval 内返回一个值 我只想以一定的时间间隔执行一些操作 这就是我尝试过的 function git limit var i 0 var git setInterval function console log i
  • 使用 JavaScript 的计时器

    我想使用java脚本实现计时器 我想随着间隔的变化而减少计时器 Example假设我的计时器从 500 开始 我想要根据级别减少计时器 例如1 一级定时器应减1 且递减速度应较慢 2 2级定时器应递减2 递减速度应为中等3 3级定时器应减3
  • Javascript 选择 onchange='this.form.submit()'

    我有一个带有选择和一些文本输入的表单 我希望在更改选择时提交表单 使用以下方法可以正常工作 onchange this form submit 但是 如果表单还包含提交按钮 则当选择更改时 表单不会提交 我猜有某种冲突 我在这里有什么选择
  • RTCDataChannel发送方法不发送数据

    我的 RTCDataChannel 遇到一个奇怪的问题 我正在对 WebRTC 进行一些研究 并且已经可以进行 WebRTC 音频 视频聊天 现在我想使用 RTCDataChannel 添加文本聊天和文件共享 我已经像这样创建了 RTCDa
  • 使用Promise而不拒绝它会导致内存泄漏吗? [复制]

    这个问题在这里已经有答案了 代码如下 function test value return new Promise function fulfill reject try fulfill true catch e throw e 我担心的是
  • 常规 JavaScript 可以与 jQuery 混合使用吗?

    例如 我可以采用这个脚本 来自 Mozilla 教程 https developer mozilla org en Canvas tutorial Basic usage
  • 如何在粘贴时获取文本区域输入字段的新值?

    我发现当我尝试从文本区域字段读取值时onpaste调用函数时 我得到字段的旧值 粘贴操作之前的值 而不是新值 粘贴操作之后的值 以下是此行为的演示 http jsfiddle net qsDnr http jsfiddle net qsDn
  • 在声明组件选择器时添加指令 - Angular 7

    我正在学习 Angular 并通过单击按钮动态创建组件 我正在尝试使用 Angular Material 的拖放功能来拖动这些创建的组件以对它们进行排序 我的基本组件 html 中有以下代码 div style margin 20px di
  • 错误:创建 React Native 项目版本 0.59.9 时找不到 template.config.js

    当我尝试创建 React Native 项目版本 0 59 9 时 出现以下错误 错误错误 无法在 react native 模板中找到 var folders zc h93bvpb573q24 5ynvgkn1wc0000gn T rnc
  • 如何根据所需表单输入的值更改 CSS 样式

    我想知道如何编写 javascript 来改变所需的表单元素的样式 如果它们有价值的话就改变它们 我想要做的是当所需的文本字段为空时 在它们周围有一个彩色边框 并在它们有值时删除边框样式 我想做的是编写一个 javascript 函数来检查

随机推荐

  • 制作一个seaborn线图,为每个点指定标准差/置信区间

    我正在尝试制作一个具有平滑的置信区间的线图 看起来像这样的东西 source pydata org https seaborn pydata org images seaborn lineplot 1 png 目前 我所做的是使用误差线来显
  • aspnet5 vNext (rc1) iis 8 - 错误网关 502.3

    我意识到存在这样的帖子 我已经阅读 重新阅读但仍然遇到问题 大多数都是旧的或不直接相关的 所以我想我应该重新发布当前的示例 尝试在 Windows Server 2012 R2 上的 IIS 8 5 中运行基本站点 此时我陷入了 502 3
  • 垂直分屏自定义形状

    I want to make a vertical split screen with a custom shape like in my attached image But it must be cross browser suppor
  • JavaScriptSerializer 将对象“集合”反序列化为对象失败的属性

    我有一个 js 对象 结构如下 object property1 some string object property2 some string object property3 property1 some string object
  • 复制整个目录但排除一些文件 php

    试图找到一种复制整个目录但排除某些文件的方法 在这种情况下只需要排除一个始终只包含 1 个 png 文件的目录 我想可以使用类似于此代码的内容 但绝对没有任何线索如何仅排除一个文件 function xcopy source dest pe
  • 堆地址范围内全局变量的地址

    我正在调试MPlayer 1 3 0源代码 我看到一个全局变量 其地址 由GDB甚至简单的打印 都在堆分配的范围内 而不是数据部分 我使用检查了堆范围procfs 555555554000 555555834000 r xp 0000000
  • Firefox VIEW SOURCE 显示登录页面

    我在 Arch Linux 上运行 Firefox 61 0 查看页面源代码时 当我浏览需要登录的网站时 我经常 但并非总是如此 估计有 20 的时间 会看到登录页面的源代码 当我浏览本地主机 每个页面的源代码都是在服务器上生成的 这不是操
  • 你能在 Python 中的核心类型上猴子修补方法吗?

    Ruby 可以向 Number 类和其他核心类型添加方法以获得如下效果 1 should equal 1 但Python似乎无法做到这一点 这是真的 如果是这样 为什么 这是否与以下事实有关 type不能修改吗 我不想讨论猴子修补的不同定义
  • 如何在 obj-c 中打印格式化的浮点数?

    如何打印float在 Objective C 中 例如 3 45代替3 45555555555 尝试像这样格式化浮动 NSLog 2f myFloat The 符号表示这将被下面的相应参数替换 myFloat The 2表示小数点后 2 位
  • 是否可以在 Artifactory 中重命名存储库?

    我们想引入一种命名约定 因为我们有大量的内部和外部存储库 因此我们希望让人们清楚什么是什么 添加这些存储库时 没有人预计事情会增长这么多 我想知道是否可以重命名存储库 我知道我可以创建新的并复制 移动其中的工件 但这看起来比我想要的要付出更
  • Automake:构建不被安装的共享模块

    如何告诉Automake构建一个不被安装的动态模块 pkglib LTLIBRARIES mywrapper la mywrapper la LDFLAGS no undefined module avoid version 导致 mywr
  • 如何在 C# 中保存随机生成器的状态? [复制]

    这个问题在这里已经有答案了 出于测试目的 我使用给定的种子创建随机数 即不基于当前时间 因此整个程序是确定性的 如果发生什么事情 我希望能够快速恢复到事件发生 不久之前 的点 因此我需要能够恢复System Random到之前的状态 有没有
  • Babel 对 Object.entries 的支持

    我正在看Object values Object entries 的第 3 阶段提案 https github com tc39 proposal object values entries我真的很想在我当前的 JavaScript 项目中
  • 过桥拼图

    晚上必须有四个人过桥 任何人过桥 无论是一个人还是两个人 都必须随身携带手电筒 必须用手电筒来回走动 每个人行走的速度不同 一个需要 1 分钟 另一个需要 2 分钟 另一个需要 5 分钟 最后 10 分钟 如果两个人一起穿过 他们必须以较慢
  • 将列表中连续出现的相同重复项目分组

    例如 我们有一个这样的列表 L item1 item2 item3 item3 item3 item1 item2 item4 item4 item4 我想将它们打包到以下形式的元组列表中 item1 1 item2 1 item3 3 i
  • 如何过期或重置地理位置

    当用户访问我的网站时 我会检查是否在 PHP 中设置了位置会话 如果没有设置与用户位置的会话 我将它们重定向到 www domain net location 在此页面上有许多选项供用户选择位置 如果浏览器允许 选项之一是使用浏览器进行设置
  • 为什么 `instance_of_object.foo is instance_of_object.foo` 的计算结果为 False? [复制]

    这个问题在这里已经有答案了 如果我有一个 class A def foo self pass 这评估为True getattr A foo is A foo 但这评估为False a A getattr a foo is a foo as
  • Android 自定义轮盘或老虎机实现

    我需要实现如图所示的类似轮子的控件 老虎机 但每个项目的边缘 项目之间的位置 需要平滑 以便它看起来像地球一样的球体 这是从 iPhone 库中获得的 iPhone 应用程序的屏幕截图 我想要安卓版的 我检查了 kankan 轮 Andro
  • 请帮助我解决VHDL编译错误[重复]

    这个问题在这里已经有答案了 library IEEE use IEEE std logic 1164 all entity doorlock is port reset in std logic enable in std logic pa
  • 如何处理 Node.js 中基于 Promise 的业务级函数中的错误返回对象?

    我需要创建一个名为 getLocationById 的业务级函数 它通过 REST API 从远程服务器检索一些数据 然后路由器调用该函数以在网页上显示数据 如果 fetch 调用成功 则将 json 结果作为 Promise 返回 但是