node.js - Express.js REST API RxJS retryWhen 不是函数
问题描述
我在 node 和 express 中制作了 REST API。看起来运算符没有被导入(我尝试了几个运算符),我不知道为什么它会在async-db.js
. 我已经尝试过,以我能想到的所有方式导入运算符,但没有成功,我也安装rxjs-compat
了你在我的package.json
. Observable 和 Subject 工作正常,我不知道我做错了什么。我在 Angular 客户端应用程序中多次使用过这样的导入,一切正常。
. 我的文件结构如下所示:
+ app.js
+ async-db.js
++ routes/routes.js
我的代码如下所示:
import { Observable, Subject, from, of} from 'rxjs';
import { map, retryWhen, delay, retry, retryTime } from 'rxjs/operators';
export function t2tObservable({ db, name, param }) {
let retryTime = 125;
let subject = new Subject();
let dbRef = db.ref(param ? name + "/" + param : name);
dbRef.once("value", (snap) => {
if (snap.val()) {
subject.next(snap.val());
subject.complete();
}
else {
subject.error(new Error("T2TError: no data"));
}
}, (e) => {
subject.error(e);
console.log("The read failed: " + e.code);
});
return subject.asObservable().retryWhen(function (errors) {
retryTime *= 2;
return errors.delay(retryTime);
});
}
错误如下所示:
return subject.asObservable().retryWhen(function (errors) {
^
TypeError: subject.asObservable(...).retryWhen is not a function
at Object.t2tObservable (...\t2tauthapi\dist\async-db.js:33:33)
at Object.<anonymous> (...\t2tauthapi\dist\routes\routes.js:36:9)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (...\t2tauthapi\dist\app.js:7:14)
我的 package.json 看起来像这样
{
"name": "t2tauthapi",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "rimraf dist/ && babel ./ --out-dir dist/ --ignore
./node_modules,./.babelrc,./package.json,./npm-debug.log --copy-files",
"start": "npm run build && node dist/app.js"
},
"author": "Toni Beverin",
"license": "ISC",
"dependencies": {
"body-parser": "^1.18.2",
"cors": "^2.8.4",
"express": "^4.16.3",
"firebase-admin": "^5.12.0",
"jsonwebtoken": "^8.2.1",
"lodash": "^4.17.10",
"rxjs": "^6.1.0",
"rxjs-compat": "^6.1.0"
},
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-preset-es2015": "^6.24.1",
"rimraf": "^2.6.2"
}
}
解决方案
从rxjs/operators
您那里导入与pipe
-operator 一起使用的函数(https://ncjamieson.com/understanding-lettable-operators/)
您直接在 Observable 上使用的函数,如.map
, .filter
, .retryWhen
... 必须被add
编辑到 Observables 的原型中。
所以你必须像这样导入retryWhen
:
import 'rxjs/add/operator/retryWhen';
但首选使用管道运算符。如果你想使用它,你必须像这样改变功能链:
从:
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/retryWhen';
subject.asObservable()
.map(...logic)
.retryWhen(...logic);
至:
import { map, retryWhen } from 'rxjs/operators';
subject.asObservable().pipe(
map(...logic),
retryWhen(...logic));
推荐阅读
- sqlite - 如何使用 SQLite 通过 create table 命令创建索引?
- python - scikit 学习逻辑回归模型 tfidfvectorizer
- java - 如何在单击重置按钮后取消选中所有选中的复选框、取消选中单选按钮、清除标记的文本字段?
- c++ - C++:使用 unique_ptr 作为地图中的键
- php - laravel中具有相同搜索字符串的多列
- php - 如何在不单击 PHP 中的注销按钮的情况下自动注销时跟踪注销时间(结束会话时间或强制关闭浏览器的选项卡/窗口)
- python - 使用 URLlib 解析 HTML - 如何打印超过 1 个标签?
- mysql - MYSQL FULLTEXT 搜索多个关键字
- spring - org.hibernate.LockMode 类型无法解析
- javafx - 为什么 ComboBox 响应延迟