2

I've found it impossible to do all the next 4 things togother:

  1. Writing in Node.js
  2. Writing in TypeScript
  3. Using async await
  4. Debugging easily

Explanation:

I have a Node.js project written in TypeScript in which I'm tring to use async await.

Now the problem is that if I transpile to ES6, the import keyword produces "unexpected token import" error as disscused here: ES6 import and export are not supported in Node.js, while if I transpile to ES5, the async await turn into unreadable code:

This:

///<reference path="../typings/modules/bluebird/index.d.ts" />
///<reference path="../typings/modules/mongodb/index.d.ts" />

import * as Promise from 'bluebird';
import { MongoClient, Db } from 'mongodb';
import {Campaign} from "../classes/Campaign";

export async function getCampaigns(): Campaign[] {
    try{
        var db = await connect();
        var campaigns: Campaign[] =  await db.collection("campaigns").find().toArray();
        return campaigns;
    }
    catch (err){
        console.log(err);
    }
}

async function connect(): Promise<Db> {
    return await MongoClient.connect("mongodb://localhost:27017/db");
}

becomes this:

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments)).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t;
    return { next: verb(0), "throw": verb(1), "return": verb(2) };
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [0, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};

    ///<reference path="../typings/modules/bluebird/index.d.ts" />
    ///<reference path="../typings/modules/mongodb/index.d.ts" />
    var Promise = require("bluebird");
    var mongodb_1 = require("mongodb");
    function getCampaigns() {
        return __awaiter(this, void 0, void 0, function () {
            var db, campaigns, err_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 3, , 4]);
                        return [4 /*yield*/, connect()];
                    case 1:
                        db = _a.sent();
                        return [4 /*yield*/, db.collection("campaigns").find().toArray()];
                    case 2:
                        campaigns = _a.sent();
                        return [2 /*return*/, campaigns];
                    case 3:
                        err_1 = _a.sent();
                        console.log(err_1);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/];
                }
            });
        });
    }
    exports.getCampaigns = getCampaigns;
    function connect() {
        return __awaiter(this, void 0, Promise, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, mongodb_1.MongoClient.connect("mongodb://localhost:27017/db")];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    }

How can I solve this paradox?

1 Answer 1

2

if I transpile to ES6, the import keyword produces "unexpected token import" error

There are actually two solutions. Pick either or combination:

  • Always use import / require instead of ES6 imports
  • Specify --module commonjs

Keep the target and ES6 and enjoy :)

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.