Каково соглашение о разделении API-интерфейсов как модулей в NodeJS? - PullRequest
0 голосов
/ 07 января 2019

Вот как выглядит мой 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 голосов
/ 08 января 2019

Я думаю, что следующая структура более удобна в обслуживании и проще для понимания (также это наиболее часто используемая структура в новых веб-приложениях в узле):

├───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

Тогда в основном все маршруты, которые вы пишете, будут контроллерами:)

0 голосов
/ 07 января 2019

Есть много способов разбить код JS на файлы, самый простой способ (который все еще довольно эффективен) - требовать модули . Вот полное руководство по , и вот минимальная демонстрация:

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

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

Чтобы код был понятным, простым и эффективным, требование, чтобы модуль не имел побочных эффектов (например, удаление файла или выполнение запросов): например, определите класс внутри модуля и экспортируйте его.

Существуют и другие способы разделения кода между файлами, например import / export .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...