Serverless: No puede tener varias funciones dirigidas a la misma ruta con diferentes métodos

Creado en 20 ago. 2016  ·  3Comentarios  ·  Fuente: serverless/serverless

Versión del marco sin servidor:

1.0.0-beta.2

Sistema operativo:

OS X 10.11.6

Comportamiento esperado:

Tenga la siguiente configuración, un método GET user/profile otro POST user/profile y reciba un error en la implementación.

functions:
  getProfile:
    handler: handler.getProfile
    events:
      - http:
          path: user/profile
          method: get
  updateProfile:
    handler: handler.updateProfile
    events:
      - http:
          path: user/profile
          method: post
Comportamiento real:
$ sls deploy
Serverless: Zipping service...
Serverless: Removing old service versions...
Serverless: Uploading .zip file to S3...
Serverless: Updating Stack...
Serverless: Checking stack update progress...
.. 
  Serverless Error ---------------------------------------

     An error occurred while provisioning your cloudformation:
     The following resource(s) failed to create: [ResourceApigEventGetprofileUserProfile].

Comentario más útil

¡Espera no! ¡Cancela esto! ¡Es solo un pequeño error mal expresado! Gente del futuro! Aquí estaba mi problema:

http://forum.serverless.com/t/deployment-error-a-sibling-did-of-this-resource-ya-has-a-variable-path-part-only-one-is-allowed/795

Entonces, esencialmente, tenía dos funciones como se muestra a continuación, con dos caminos como este:

          path: tasks/{taskId}
          path: tasks/{taskToUpdate}

¡Y ambas rutas necesitaban la misma clave, por lo que debería haber usado {taskId} en ambas ocasiones!

La única solicitud que tengo para un desarrollador que ve esto es quizás dar un mejor mensaje de error que el que da AWS.

functions:

  updateTask:
    handler: lib/endpoints.createTask
    events:
      - http:
          path: tasks/{taskToUpdate}
          method: put
          cors: true

  deleteTask:
    handler: lib/endpoints.deleteTask
    events:
      - http:
          path: tasks/{taskId}
          method: delete
          cors: true

Todos 3 comentarios

Esto también se resolvió al volver a crear la pila. #1908

Tengo este error también. Sin embargo, cuando ejecuto "eliminación sin servidor", luego "implementación sin servidor -v", no resolvió el problema. Esto es un problema ya que tengo una API normal que sigue el formato estándar CRUD (como django-rest-framework o AngularJS Resource. Quiero tener URL como:

POST    http://blahblah/task/            # Creates a new task
GET     http://blahblah/task/            # Gets all tasks
GET     http://blahblah/task/{taskId}    # Gets a specific task
PUT     http://blahblah/task/{taskId}    # Updates a specific task
DELETE  http://blahblah/task/{taskId}    # Deletes a specific task

Estoy de acuerdo con hacer cosas exóticas para lograr esto, solo quiero este formato de URL.

Aquí está el error que obtengo:

Serverless: Deployment failed!

  Serverless Error ---------------------------------------

     An error occurred while provisioning your stack: ApiGatewayResourceTasksParenttaskidVar
     - A sibling ({taskId}) of this resource already has
     a variable path part -- only one is allowed.

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues

  Your Environment Information -----------------------------
     OS:                 win32
     Node Version:       7.0.0
     Serverless Version: 1.7.0

¡Espera no! ¡Cancela esto! ¡Es solo un pequeño error mal expresado! Gente del futuro! Aquí estaba mi problema:

http://forum.serverless.com/t/deployment-error-a-sibling-did-of-this-resource-ya-has-a-variable-path-part-only-one-is-allowed/795

Entonces, esencialmente, tenía dos funciones como se muestra a continuación, con dos caminos como este:

          path: tasks/{taskId}
          path: tasks/{taskToUpdate}

¡Y ambas rutas necesitaban la misma clave, por lo que debería haber usado {taskId} en ambas ocasiones!

La única solicitud que tengo para un desarrollador que ve esto es quizás dar un mejor mensaje de error que el que da AWS.

functions:

  updateTask:
    handler: lib/endpoints.createTask
    events:
      - http:
          path: tasks/{taskToUpdate}
          method: put
          cors: true

  deleteTask:
    handler: lib/endpoints.deleteTask
    events:
      - http:
          path: tasks/{taskId}
          method: delete
          cors: true
¿Fue útil esta página
0 / 5 - 0 calificaciones