【问题标题】:Google Cloud Functions - what is the entry point for Express js and Node JS 10?Google Cloud Functions - Express js 和 Node JS 10 的入口点是什么?
【发布时间】:2021-04-12 11:43:19
【问题描述】:

我的 Node JS 版本是 10

Express JS 版本:4.16.1

我知道[Node JS 8 的入口点应该是“app”][1]

生成的代码(来自`npm install -g express-generator) www

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('myexpressapp:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

package.json

{
  "name": "myexpressapp",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "morgan": "~1.9.1",
    "pug": "2.0.0-beta11"
  }
}

app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

这是 Google Cloud Functions 的 hello world 示例,它基于他们自己的 Functions Framework: [![在此处输入图片描述][2]][2]

这是我的看法 [![在此处输入图片描述][3]][3]

最终更新 在 app.js 中添加了以下内容,但它仍然不起作用

//...
module.exports = app;

exports.app = functions.http.onRequest(app);
module.exports = { app };

`` 构建失败:function.js 不存在;错误 ID:7485c5b6




  [1]: https://stackoverflow.com/questions/57587844/error-could-not-handle-the-request-with-google-cloud-function-and-express/57592171#57592171
  [2]: https://i.stack.imgur.com/WOOaw.png
  [3]: https://i.stack.imgur.com/F52jv.png
  [4]: https://i.stack.imgur.com/qmRe9.png

【问题讨论】:

  • 不,应用程序仅适用于示例。它是函数的名称。如果您需要更多指导,请分享您的功能代码。

标签: javascript node.js express google-cloud-functions


【解决方案1】:

入口点是在函数部署期间定义的。正如您在已链接答案的屏幕截图中所见,您必须指定函数的名称。如果您使用控制台,则必须使用--entry-pointflag 指定入口点。更多信息here.

关于您的问题有两个要点:

  1. 无论您使用什么 express 设置,对 GCP Cloud Functions 都绝对没有影响。尽管它可能在后台使用 Express,但对于 GCP,您的函数是一个单一/简单的 JS 方法,它将在触发器被激活时执行
  2. 确保通过导出功能使其可用,例如
module.exports = {
  my_function_name
}

【讨论】:

  • 对不起,我不是这里的专家。我应该在我的 Express 的 app.js 中添加什么? module.exports = { app.listen(8000) };
  • 仅限module.exports = { app }
  • 正如@AntonioRamirez 提到的那样,但请查看您发布的关于函数框架使用的相同问题的另一个问题。再说一次,Express App != GCP Functions App。 stackoverflow.com/questions/65600181/…
猜你喜欢
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2016-06-25
  • 2020-09-21
相关资源
最近更新 更多