【问题标题】:Firebase functions with multiple functions具有多种功能的 Firebase 功能
【发布时间】:2021-01-29 05:38:45
【问题描述】:

我正在使用 firebase Functions 来显示 NodeJS + Express 并将请求与 API-Rest 分开我将几个函数分开如下:

const auth     = require('./functions/auth');
const user     = require('./functions/user');
const msgtypes = require('./functions/msgtypes');
const msg      = require('./functions/msg');
const comment  = require('./functions/comment');
//const test = require('./functions/test');

exports.auth      = auth.app
exports.user      = user.app
exports.msg       = msg.app
exports.msgtypes  = msgtypes.app  
exports.comment = comment.app 

每个函数都是这样的: (用户功能) const app = require('./app');

app.get('/me',      general.logUrl,                                ctrl.me)
app.put('/images',  general.logUrl,general.isLoged, upload.any() , ctrl.removeImage)
app.post('/images', general.logUrl,general.isLoged, upload.any() , ctrl.uploadImage)
app.get('/images',  general.logUrl,general.isLoged,                ctrl.getImages)
//app.get('/',                         ctrl.get)
app.get('/notifs',  general.logUrl,                 ctrl.getMyNotifs)
app.post('/',       general.logUrl,general.isAdmin, ctrl.createUser)
app.post('/profile',general.logUrl,                 ctrl.publicProfile)
app.post('/contact',general.logUrl,                 ctrl.contactUser)
app.get('/:id',     general.logUrl,general.isAdmin, ctrl.getData)


app.post('/status/:id', general.logUrl,general.isAdmin, ctrl.status)  
app.put('/',            general.logUrl,general.isLoged, ctrl.update)
app.post('/edit',       general.logUrl,general.isLoged, ctrl.update)
app.post('/change/:id', general.logUrl,general.isLoged, ctrl.change)
app.post('/changePass', general.logUrl, general.isLoged, ctrl.changeUserPass)
app.delete('/:id',      general.logUrl, general.isAdmin, ctrl.remove) 
 
exports.app = functions.region(process.env.REGION).https.onRequest(app) 

(味精功能)

const app     = require('./app');    

app.post('/search_by' , general.logUrl,                                 ctrl.searchWithParams   )
app.post('/search'    , general.logUrl,                                 ctrl.search             )
app.get('/my'         , general.logUrl, general.isLoged,                ctrl.getMy           )
//app.get('/'           general.logUrl,, general.isAdmin,               ctrl.get                ) 
app.post('/create'    , general.logUrl, general.isLoged,                ctrl.createNew       ) 
app.put('/'           , general.logUrl, general.isLoged,                ctrl.update             )
app.post('/edit'      , general.logUrl, general.isLoged,                ctrl.update             )
app.delete('/:id'     , general.logUrl, general.isLoged,                ctrl.remove             )
app.get('/comment/:id', general.logUrl, general.isLoged,                ctrl.getComments        )
app.delete('/images'  , general.logUrl, general.isLoged,                ctrl.removeImage        )
app.post('/images'    , general.logUrl, general.isLoged, upload.any() , ctrl.uploadImage        )
app.get('/images'     , general.logUrl, general.isLoged,                ctrl.getImages          )
app.get('/images/:id' , general.logUrl, general.isLoged,                ctrl.getImages          )
app.get('/:id'        , general.logUrl,                                 ctrl.getData            )
app.post('/:id'       , general.logUrl, general.isLoged,                ctrl.comment            )

//app.use('/comment', require('./comment.route')              )

exports.app = functions.region(process.env.REGION).https.onRequest(app)

问题是,当我在 /tas/images 上发帖时,我正在回答我为 /user/me 提供的功能。

第一个是 POST,第二个是 GET,我不明白发生了什么。如果有人可以给我建议或指导,我会举例说明我是如何组织的。

【问题讨论】:

  • 那么,您收到的结果好像是在使用另一个函数?你尝试POST/ tas / images,结果是GETuser / me?您是否尝试过仅使用此功能部署所需的最低限度?
  • 我试着把每个功能一点一点上去;并且似乎当它匹配时,控制器的方法以相同的方式被调用。或者与另一个函数重合的方法不知道要回答哪个函数。我开始认为这是创建 Express 应用程序时的错误,该应用程序在不同功能之间共享创建的对象。将此代码作为节点项目而不是函数启动不会出现此问题。

标签: firebase google-cloud-functions


【解决方案1】:

我一直在尝试不同的方法来解决这个问题,我找到了解决方案,但不是很聪明,我希望有人帮助我尊重。

问题来自我创建 ExpressJs 应用程序的方式。我将它放在一个单独的模块的导出中以获得我需要的配置,但从它看起来像单例一样工作,所以在应用路由时,对应于方法的最后一个正在响应。

解决方案是直接在每个函数中创建对象,如下所示。

let corsOpts = (req, res, next) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Accept,X-ACCESS_TOKEN,Authorization,authorization,x-access-token');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,X-ACCESS_TOKEN,Authorization,authorization,x-access-token");
    res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    if ('OPTIONS' === req.method) {
        //respond with 200
        console.log("REQ", "OPTIONS");
        res.sendStatus(200);
      } else {
        //move on
        return next(); 
      }
    return res
}
  
app.use(corsOpts);
app.all('*', corsOpts);
app.use(cors());
app.options('*', cors())

//app.use(express.json());
//app.use(express.urlencoded({ extended: false })); 
app.use(express.static(path.join(__dirname, 'public')));  
app.use(bodyParser.json({limit: '50mb'}));
//app.use(bodyParser.urlencoded({limit: '50mb', extended: true}))

app.disable('x-powered-by');    

app.post('/change_password',general.logUrl,                  ctrl.changePasswordAuth )
app.post('/getByToken'     ,general.logUrl,                  ctrl.getByTokenAuth     )
app.post('/register'       ,general.logUrl,                  ctrl.registerAuth       )
app.post('/recovery'       ,general.logUrl,                  ctrl.recoveryAuth       )
app.get('/recovery/:token' ,general.logUrl,                  ctrl.recoveryGetByTokenAuth       )
app.post('/login'          ,general.logUrl,                  ctrl.loginAuth          )
app.get('/list'            ,general.logUrl, auth.isAdmin,    cUser.getUser           ) 
app.get('/me'              ,general.logUrl, auth.isLoged,    cUser.meUser            )
app.get('/status/:id'      ,general.logUrl, auth.isAdmin,    cUser.statusUser        )
app.post('/user_role/:id'  ,general.logUrl, auth.isAdmin,    ctrl.user_roleAuth      )

exports.app = functions.region(process.env.REGION).https.onRequest(app)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-22
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多