【问题标题】:TypeScript, NodeJs/Express and Mongo (with VS 2013)TypeScript、NodeJs/Express 和 Mongo(使用 VS 2013)
【发布时间】:2014-05-08 04:04:29
【问题描述】:

我正在尝试创建一个基于节点(和 Express)的应用程序,该应用程序在功能上类似于使用 Mongo 作为数据存储的 WebAPI 应用程序。我正在尝试使用 TypeScript(以及 VS 2013)。

我已经让它工作了,现在我正在尝试清理它。

首先,Express 4.1.1 可用,但没有任何类型。

其次,访问 Mongo 的正确方法是什么 - 建立连接和查询集合 - 这样它是 Node 希望的异步方式(所以我没有阻塞等)?我应该使用 q/Promises 吗?

第三,访问另一个文件中的方法的正确方法是什么(在此设置中)?我已经与 import/export/require/module/class 搏斗了一段时间,以获得我认为似乎 ok 的东西,但是到达那里是多么痛苦。这是我所拥有的:

app.ts 带有一些导入等和参考

/// <reference path='./scripts/typings/node/node.d.ts' />

import express = require('express');
import http = require('http');
import path = require('path');

import badgeApi = require('./routes/api/Badge');

var app = express();
...
new badgeApi.Badge();
app.get('/badge', badgeApi.Badge.ListAll);
...

然后,一些通用数据库代码:

/// <reference path='../../scripts/typings/mongodb/mongodb.d.ts' />

import util = require('util');
import mongodb = require('mongodb');

export var ConnectDataStore: (dbname: string, dbuser: string, dbpass: string) => mongodb.Db;

ConnectDataStore = (dbname: string, dbuser: string = 'xxxx', dbpass: string = 'xxxx') => {
    var baseMongoConnect: string = 'xxxx';
    var mongoConnect = util.format(baseMongoConnect, dbuser, dbpass, dbname);
    var DB: mongodb.Db;

    mongodb.MongoClient.connect(mongoConnect, (err, db) => {
        if (!err) {
            DB = db;
            return DB;
        }
        else {
            throw err;
        }
    });
}

然后是 Badge.ts

import util = require('util');
import express = require('express');
import mongodb = require('mongodb');
import datastore = require('./DataStore');

export class Badge {
    private static DB: mongodb.Db = null;

    constructor() {
        Badge.DB = datastore.ConnectDataStore('credential', 'xxxx', 'xxxx')
    }

    public static ListAll(req: express.Request, res: express.Response): void {
        Badge.DB.collection('badge', (collErr, coll) => {
            coll.find().toArray((arrayErr, badges) => {
                if (badges.length > 0) {
                    res.jsonp(200, badges);
                }
                else {
                    res.send(200, 'No Badges');
                }
            });
        });
    }
}

现在我知道这并不完全有效 - ConnectDataStore 是错误的(它没有返回应有的 Db)。当我注意到我使用的是 express 3.5.2,而不是 4.1.1 时,我开始通过让它返回一个 promise 来解决这个问题,这一切终于让我明白了 - 这东西不是很可靠。

当然,我可能遗漏了什么,但我不知道是什么

任何关于这汤的方向都将不胜感激!

【问题讨论】:

  • (我认为你这里有太多不相关的问题,无法实际回答)。
  • #1) 我建议在 express 部分使用 JavaScript 来开始。对于您可能需要快速表达的少量代码,使用 TypeScript 几乎没有什么好处。话虽如此,您可能会发现 Express 3.1 的类型对于 4.1+ 来说已经足够好,因此它可以毫无问题地工作。
  • 这是一个公平的观点。我很乐意接受您迄今为止提供的答案以及如果导入和模块等的合理使用的链接/解释 - 或者,只是告诉我我所拥有的内容是正确的。 “新”——那个类似乎是错误的。
  • @WiredPrarie - 让我们再做一次。按照“将 javascript/typescript、js 用于简单的东西和 ts 仅在有用的地方,比如控制器”的思路创建一个答案 - 我会接受它。

标签: node.js express typescript


【解决方案1】:

在没有 Express 4+ 的定义文件之前,我建议您使用 JavaScript 作为应用程序的核心(因为它不需要进行太多更改),并将 TypeScript 用于应用程序逻辑(控制器等)之类的东西.在 Node.JS 中,很容易混搭。

我会使用 Promise 来处理 MongoDB 连接或尽早建立连接,以使应用程序真正开始为网页提供服务直到成功建立 MongoDB 连接。

Express 的 3.0 分型可能在许多地方与 4+ 版本一起使用,因为签名通常是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多