使用TypeScript生成器/ yield与Express不会返回数据

时间:2018-01-05 15:02:37

标签: typescript express generator

我正在尝试在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 );
        });
    });
}

2 个答案:

答案 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