我正在尝试在Express JS中使用ES6生成器和TypeScript,但是我的实现如下所示,响应似乎没有发回任何东西,我想知道我错过了什么:
Main.ts
import * as routes from "./routes";
app = express();
app.use("/", routes);
Routes.ts
import { Request, Response, NextFunction, Router } from "express";
import * as Test from "./test";
const routes: Router = Router();
routes.get( "/*", ( req: Request, res: Response, next: NextFunction ) => {
console.log( "url", req.originalUrl );
next();
} );
// Test
routes.get( "/test/ajax", Test.ajax );
export = routes;
Test.ts文件
export function *ajax(req: Request, res: Response) {
const html: string = yield getHtml("http://www.wagamatic.com");
res.send({
length: html.length
});
}
function getHtml(url: string): Promise<string> {
return new Promise<string>((resolve) => {
axios.get(url).then((res) => {
resolve( <string>res.data );
});
});
}
答案 0 :(得分:2)
好吧,当调用ajax
函数时,它只会返回一个创建的生成器 - 它不会处理请求。将console.log
放在ajax
函数的正文中并提出请求 - 您将看到不会调用console.log
。另外,尝试像console.log(ajax())
这样的东西 - 你会看到返回值是一个生成器对象。
我建议你在Typescript中使用async/await
,就像那样:
export async function ajax(req: Request, res: Response) {
const html: string = await getHtml("http://www.wagamatic.com");
res.send({
length: html.length
});
}
如果要让生成器运行,可以使用co
之类的模块,或者自己编写异步执行程序。 Here你可以找到一个简单的例子,说明如何在节点中自己做。我仍然建议你坚持async/await
。
答案 1 :(得分:0)
这不是产量的效果。您基本上将它用作async / await,这是我推荐的,因为它更加用户友好。
通常我会写如何解决问题,但你没有单独使用yield正确。查看此页面并首先尝试使用它(或开始使用async / await):https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield