Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js TypeScript、NodeJs/Express和Mongo(与VS 2013一起)_Node.js_Express_Typescript - Fatal编程技术网

Node.js TypeScript、NodeJs/Express和Mongo(与VS 2013一起)

Node.js TypeScript、NodeJs/Express和Mongo(与VS 2013一起),node.js,express,typescript,Node.js,Express,Typescript,我正在尝试创建一个基于节点(和Express)的应用程序,它在功能上类似于使用Mongo作为数据存储的WebAPI应用程序。我正在尝试使用TypeScript(还有VS2013) 我已经让它工作了,现在我正在努力清理它 首先,Express 4.1.1是可用的,但它没有打字功能 第二,访问Mongo的正确方法是什么——建立连接和查询集合——以使其与Node希望的方式异步(所以我没有阻塞,等等)?我应该使用q/承诺吗 第三,在这个设置中,访问另一个文件中的方法的正确方式是什么?我已经为导入/导出/

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

我已经让它工作了,现在我正在努力清理它

首先,Express 4.1.1是可用的,但它没有打字功能

第二,访问Mongo的正确方法是什么——建立连接和查询集合——以使其与Node希望的方式异步(所以我没有阻塞,等等)?我应该使用q/承诺吗

第三,在这个设置中,访问另一个文件中的方法的正确方式是什么?我已经为导入/导出/需求/模块/类绞尽脑汁了一段时间,想得到我认为还行的东西,但要做到这一点真是太痛苦了。以下是我所拥有的:

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);
...
现在我知道这完全不起作用了——ConnectDataStore是错误的(它不会像预期的那样返回Db)。当我注意到我使用的是express 3.5.2,而不是4.1.1时,我开始通过让它返回一个承诺来解决这个问题,最终我明白了——这个东西不是很可靠

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


任何关于这汤的指示都将不胜感激

在出现Express 4+的定义文件之前,我建议您使用JavaScript作为应用程序的核心(因为它不需要太多更改),并使用TypeScript作为应用程序逻辑(控制器等)。在Node.JS中,很容易混合和匹配

我会承诺处理MongoDB连接,或者尽早建立连接,直到成功建立MongoDB连接,应用程序才真正开始为网页提供服务


Express的3.0打字可能在许多地方与4+版本配合使用,因为签名通常是相同的。

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