用 Koa 提供 Restful service 和查询 MongoDB 的例子
const path = require('path'); const Koa = require('koa'); const app = new Koa(); const compose = require('koa-compose'); const router = require('koa-router')(); const bodyParser = require('koa-bodyparser'); const static = require('koa-static'); const static_root = static(path.join(__dirname + "/../client/dist")); // Point to the root of web app const MongoClient = require('mongodb').MongoClient; const DB_CONN_STR = 'mongodb://localhost:27017/sample'; // Variable for storing query result var result = null; // ********************************** Koa part ********************************** // Error handler const handler = async (ctx, next) => { try { await next(); } catch (err) { ctx.response.status = err.statusCode || err.status || 500; ctx.response.type = 'html'; ctx.response.body = '<h2>Something wrong, please contact administrator.</h2>'; // ctx.app.emit('error', err, ctx); } }; // Logger const logger = async (ctx, next) => { console.log(`${ctx.request.method} ${ctx.request.url}`); await next(); }; const middlewares = compose([handler, bodyParser(), router.routes(), logger, static_root]); app.use(middlewares); // ********************************** DB part ********************************** // Common function to connect mongoDB, and run the callback function var runDb = function (callback) { MongoClient.connect(DB_CONN_STR, function (err, db) { if (err) { console.log("Error: ", err); db.close(); process.exit(1); } else { callback(db); db.close(); } }); } // Data for insert var data1 = [ { "name": "AAA", "age": 1 }, { "name": "BBB", "company": "Google Co." } ]; // Insert function, just for testing var insertData = function (db) { db.collection("table1").insert(data1, function (err, result) { if (err) { console.log("Error: ", err); return; } }); } // Query function var queryData = function (db) { db.collection("table1").find({}).toArray(function (err, docs) { if (err) { console.log("Error: ", err); } else { result = docs; } }); } // Call the db to insert data runDb(insertData); // ********************************** Controller part ********************************** // Redirect the root to Angular index.html router.get('/', async (ctx, next) => { ctx.response.redirect('/index.html'); }); // Just an api for testing router.get('/ui-api/hello/:name', async (ctx, next) => { // just for sample var name = ctx.params.name; ctx.response.body = `<h1>Hello, ${name}!</h1>`; }); // Just an api for testing router.get('/ui-api/data', async (ctx, next) => { runDb(queryData); ctx.response.type = 'json'; // ctx.set("Access-Control-Allow-Origin", "*"); // Disable cross origin ctx.response.body = result; }); // ********************************** Startup part ********************************** let port = 80; app.listen(port); console.log('app started at port : ' + port);