在NodeJS中将API分离为模块的惯例是什么?

时间:2019-01-07 16:13:33

标签: node.js express

这是我的app.js的样子...

我想知道如何将单个文件分成多个文件以提高代码质量。我们该怎么做?

我的想法是拥有以下文件...
server.js->用于服务器相关属性
serve.js->这将成为package.json中的主文件
apis->这应该是带有apis的文件,我也能够根据模块来分隔apis ...

NodeJS的首选约定是什么?我确定我们不想在一个文件中编写所有api。

    const express = require('express') // import express module
    const app = express() // initiate express app
    app.use(express.json()) // not sure what this is but without it POST cant read the JSON parameters from the body
    const host = 'localhost' // host
    const port = process.env.PORT || 1338 // pick port
    const routePrefix = '/' + 'api' + '/' // this is the route prefix used from where the APIs will be accesssed

    const routes = { // define routes
    root: routePrefix + 'root',
    test: routePrefix + 'test',
    items: routePrefix + 'items',
    item: routePrefix + 'items/:id'
}

    // print details
    function printDetails(currentRoute, requestMethod, requestParams, 
    requestQuetyString) {
       console.log(currentRoute, requestMethod, requestParams, requestQuetyString);
    }

    // get root
    app.get(routes.root, (req, res) => {
        printDetails(routes.root, req.method, req.params, req.query)
        res.send(routes.root)
    })

    // get test route
    app.get(routes.test, (req, res) => {
        printDetails(routes.test, req.method, req.params, req.query)
        res.send(routes.test)
    })

    // for the web server
    app.use(express.static('../public')) // this is where static files reside and need to be served to for the clientside app

    // start the API server and Web server
    app.listen(port, () => {
        console.log(`
        \nExpress Server started on port ${port}..
        APIs can be accessed at http://${host}:${port}${routePrefix}
        Web Server started on port http://${host}:${port}
        `)
    })

我已经尝试过了,各个文件看起来像这样。但是,我无法运行它。

server.js

const express = require('express') // import express module
const app = express() // initiate express app
app.use(express.json()) // not sure what this is but without it POST cant read the JSON parameters from the body
//const api = require('./apis')
//const app = api.app
const host = 'localhost' // host
const port = process.env.PORT || 1338 // pick port
const routePrefix = '/' + 'api' + '/' // this is the route prefix used from where the APIs will be accesssed
const routes = { // define routes
    root: routePrefix + 'root',
    test: routePrefix + 'test',
    items: routePrefix + 'items',
    item: routePrefix + 'items/:id'
}
// for the web server
app.use(express.static('../public')) // this is where static files reside and need to be served to for the clientside app

module.exports = {
    app: app,
    host: host,
    port: port,
    routePrefix: routePrefix,
    routes: routes
}

serve.js

const server = require('./server') // import server module
//const app = server.app

// start the API server and Web server
server.app.listen(server.port, () => {
    console.log(`
    \nExpress Server started on port ${server.port}..
    APIs can be accessed at http://${server.host}:${server.port}${server.routePrefix}
    Web Server started on port http://${server.host}:${server.port}
    `)
})

api.js

'use strict'
const server = require('./server') // import sever module
const app = server.app

// get test route
app.get(server.routes.test, (req, res) => {
    printDetails(server.routes.test, req.method, req.params, req.query)
    res.send(server.routes.test)
})

module.exports = {

}

我面临的问题是如何使用module.exports以及从什么模块中导出什么。我的要求是,当我运行“ node serve.js”时,我应该能够运行API,并且它们应该可供客户端使用。我该如何实现?

2 个答案:

答案 0 :(得分:1)

我认为以下结构更易于维护和理解(这也是节点中新Web应用程序中更常用的结构):

├───client        <-- Your web client application directory
│   └───assets
├───common        <-- Common (shared) files between client and server
└───server        <-- Your SugoiJS server directory
    ├───config    <-- Build config (environment, webpack)
    │   └───webpack
    └───src       <-- Your server app source code
        ├───app   <-- Bootstrap module, Server initialize and listener files, 'authorization' class(optional)
        │   └───classes
        ├───config     <-- Server configuration (services, paths, etc.)
        └───modules    <-- All of you application modules
            └───index  <-- Single module
                ├───controllers    <-- Modules' controllers
                ├───models         <-- Modules' models(optional)
                └───services       <-- Modules' services

这来自SugoiJS框架。 https://wiki.sugoijs.com/get-started

然后,您所写的所有路由基本上都是控制器:)

答案 1 :(得分:0)

有很多方法可以将JS代码拆分为文件,最简单的方法(仍然非常有效)是需要模块。这是full guide,这是一个最小的演示:

// lib.js
module.exports = {
  x: 10,
  y: () => 20
}

// index.js
const lib = require('./lib');
console.log(lib.x); // 10
console.log(lib.y()); // 20

为使代码清晰,简单且高效,要求模块不应有任何副作用(即删除文件或发出请求):例如,在模块内部定义一个Class并将其导出。

还有其他方法可以在文件之间分割代码,例如import/export