Как запустить приложение REST API node.js в рабочей среде - PullRequest
1 голос
/ 08 октября 2019

Хорошо, так что сразу я чувствую себя немного глупо, задавая этот вопрос, но я немного новичок в приложениях node.js, так что терпите меня. Я написал этот REST API в node.js, и он прекрасно работает на моей локальной машине. Но когда я собираю его с помощью веб-пакета, я не совсем уверен, как он должен работать на самом деле. Локально у меня есть файл server.js, использующий файл Express, который я начинаю использовать с помощью узла. Но как мне запустить версию сборки? Я уверен, что ответ очевиден, я просто не вижу его.

Моя цель - иметь возможность запустить это на поддомене в моем решении общего хостинга, так что у меня будет что-то вроде конечной точки примераиз https://myapi.mydomain.com/getAListOfSomething/

Итак, суть в том, что я хочу использовать Webpack для создания своего приложения, затем развернуть его где-нибудь и использовать как обычный API. Я просто не уверен, что с этим делать. Что-то вроде приложения React, для меня это совершенно очевидно (файл index.html с тегом скрипта для моего приложения, очень простой), но с чем-то вроде этого я потерян.

Итак, вот некоторый код. ..

SERVER.JS

const routes = require('./routes/appRoutes.js');
const express = require('express');
const cors = require('cors');

process.env.NODE_ENV = process.env.NODE_ENV || 'development';
const envPath = process.env.NODE_ENV !== 'production' ? `.env.${process.env.NODE_ENV}` : '.env';
const config = require('dotenv').config({path: envPath});

 bodyParser = require('body-parser');
 app = express();
 port = process.env.PORT || 3001;
 app.use(cors());
 app.listen(port);
 console.log(process.env.APP_NAME + ' started on port ' + port +' (yay!)');

 app.use(bodyParser.urlencoded({ extended: true }));
 app.use(bodyParser.json());

 routes(app); //register the route

* WEBPACK.CONFIG.JS *

const path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const webpack = require('webpack');
const nodeExternals = require('webpack-node-externals');
process.env.NODE_ENV = process.env.NODE_ENV || 'development';

const envPath = process.env.NODE_ENV !== 'production' ? `.env.${process.env.NODE_ENV}` : '.env';
const config = require('dotenv').config({path: envPath});


module.exports = (env) => {
    const isProduction = env==='production';

    return {
        entry: './routes/appRoutes.js',
        output: {
            path: path.join(__dirname,'public','dist'),
            filename: 'bundle.js'
        },
        target: 'node',
        node: {
            // Need this when working with express, otherwise the build fails
            __dirname: false,   // if you don't put this is, __dirname
            __filename: false,  // and __filename return blank or /
          },        
        externals: [nodeExternals()],
        module: {
            rules: [{
                loader: 'babel-loader',
                test: /\.js$/,
                exclude: /node_modules/
            }]
        },
        plugins: [
            new webpack.DefinePlugin({
             'process.env.APP_NAME': JSON.stringify(process.env.APP_NAME),
             'process.env.DB_HOST': JSON.stringify(process.env.DB_HOST),
             'process.env.DB_USERNAME': JSON.stringify(process.env.DB_USERNAME),
             'process.env.DB_PASSWORD': JSON.stringify(process.env.DB_PASSWORD),
             'process.env.DB_PASSWORD': JSON.stringify(process.env.DB_PASSWORD),
             'process.env.PORT': JSON.stringify(process.env.PORT)      
            })
         ],
        devtool: isProduction ? 'source-map' : 'inline-source-map',
        devServer: {
            contentBase: path.join(__dirname,'public'),
            port: 3300,
            historyApiFallback: true,
            publicPath: '/dist/'
        }    
    }
};  

PACKAGE.JSON

{
    "name": "spinder-api",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "build:dev": "webpack -p --env development",
        "build:prod": "webpack -p --env production",
        "dev-webpack": "webpack-dev-server --env development",
        "dev-server": "node app.js --env development"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "dependencies": {
        "@babel/cli": "^7.0.0",
        "@babel/core": "^7.0.0",
        "@babel/preset-env": "^7.0.0",
        "babel-watch": "^7.0.0",
        "bcrypt": "^3.0.4",
        "body-parser": "^1.18.3",
        "cors": "^2.8.5",
        "db-migrate-mysql": "^1.1.10",
        "dotenv": "^6.2.0",
        "express": "^4.16.4",
        "extract-text-webpack-plugin": "^3.0.2",
        "multer": "^1.4.2",
        "mysql": "^2.16.0",
        "type-of-is": "^3.5.1"
    },
    "devDependencies": {
        "@babel/core": "^7.6.2",
        "@babel/preset-env": "^7.6.2",
        "babel-loader": "^8.0.6",
        "html-loader": "^0.5.5",
        "html-webpack-plugin": "^3.2.0",
        "nodemon": "^1.18.10",
        "webpack": "^4.41.0",
        "webpack-cli": "^3.3.9",
        "webpack-dev-middleware": "^3.7.2",
        "webpack-dev-server": "^3.8.2",
        "webpack-hot-middleware": "^2.25.0",
        "webpack-node-externals": "^1.7.2"
    }
}

.ENV [.DEVELOPMENT] ПРИМЕР (Примечание:Конечно, у меня есть разрабатываемая и производственная версия ...)

APP_NAME=spinder_api
DB_HOST=localhost
DB_USERNAME=db_username
DB_PASSWORD=my_strong_passwrod
DB_DATABASE=my_app_database
PORT=3300

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

На этот вопрос очень сложно ответить, учитывая, что существует множество способов развертывания приложения. Есть такие объекты, как Google Cloud Platform, Amazon Web Services, Microsoft Azure, ZEIT Now, Heroku и многие другие. Все они имеют возможность добавлять свои конечные точки и сертификаты для домена, который вы купили. Вот несколько примеров:

  • В веб-сервисах Amazon есть корзины S3, где вы можете объединить свое приложение и поместить статический вывод в корзину, настроить приложение для обеспечения доступности и многое другое. (https://medium.com/codebase/using-aws-s3-buckets-in-a-nodejs-app-74da2fc547a6, https://docs.aws.amazon.com/s3/index.html)

  • В облачной платформе Google имеется App Engine, который относительно прост в настройке и развертывании приложения. При этом GCP чрезвычайно мощен и может устрашатьначинающий разработчик. (https://cloud.google.com/appengine/docs/nodejs/) Есть также конечные точки GCP для управления API.

  • Heroku довольно просто, чтобы через несколько минут сделать ваше приложение доступным для внешнего мира. https://devcenter.heroku.com/articles/getting-started-with-nodejs

  • Zeit Now предлагает вариант с нулевой конфигурацией для развертывания вашего приложения и может быть хорошим местом для запуска. (https://zeit.co/)

Вы можете использовать любоеконечная точка, для которой настроен доступ к вашему приложению, API и т. д.

0 голосов
/ 08 октября 2019

в конфигурации вашего веб-пакета, которую вы собираете для public/dist/, там должно быть bundle.js для запуска. Тогда просто node bundle.js

Это кажется странным местом для проекта узла, но его легко изменить.

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