Publications and Methods as REST API


I’m trying to follow the Meteor Guide at Publications and Data Loading | Meteor Guide at chapter " Accessing a publication as a REST endpoint". I did

meteor add simple:rest

But when I try to issue the command ```
curl localhost:3000/users/login -H “Content-Type: application/json” --data ‘{“email”: “”, “password”: “password”}’

Meteor answers with some HTML :

link rel=“stylesheet” type=“text/css” class=“meteor-css” href="/merged-stylesheets.css?hash=6b1f9f6fb78291ae58da8ec4f36476931155453c"
title my-app /title

What am I missing ?

I think you are missing publications in your URL

The example code in the Meteor guide does this:

 curl localhost:3000/publications/lists.public

This will access a publication called lists.public

I’m trying to access a private publication so before accessing it I need to get a bearer token.

I finally managed to get it with the request
curl http://customer01.localhost/users/login -k -L -H "Content-Type: application/json" --data '{"username": "", "password": "PWD"}'
(the error I got before was due to some nginx config error)

The response gives me a token which I use in the actual publication query

curl https://customer01.localhost/publications/sessions.listAssignedOpenSessions -k -L -H "Authorization: Bearer XD2aAdw0iXFVgHY7vDXYP0h7KtsbgDaoFhTEUpIsmgg"

But then I get the error

Error: Meteor.userId can only be invoked in method calls or publications. at AccountsServer.userId (packages/accounts-base/accounts_server.js:124:13)

On server side the errors are

W20220523-10:19:14.914(2)? (STDERR) Error: Meteor.userId can only be invoked in method calls or publications.
W20220523-10:19:14.915(2)? (STDERR)     at AccountsServer.userId (packages/accounts-base/accounts_server.js:124:13)
W20220523-10:19:14.915(2)? (STDERR)     at AccountsServer.user (packages/accounts-base/accounts_common.js:165:25)
W20220523-10:19:14.915(2)? (STDERR)     at Object.Meteor.user (packages/accounts-base/accounts_common.js:415:35)
W20220523-10:19:14.915(2)? (STDERR)     at getOrCreateTenant (imports/model/Tenant.ts:18:25)
W20220523-10:19:14.916(2)? (STDERR)     at HttpSubscription.<anonymous> (imports/api/sessions/server/publications.ts:10:20)
W20220523-10:19:14.916(2)? (STDERR)     at packages/simple_rest.js:241:33
W20220523-10:19:14.916(2)? (STDERR)     at packages/simple_json-routes.js:100:9

My publication called “sessions.listAssignedOpenSessions” is implemented in imports/api/sessions/server/publications.ts so it seems it finds it fine, but why can’t it access AccountsServer.user ? as this is the point of making the authenticated call ?

I’m using Meteor 2.7.2 with simple:rest 1.2.1

Any idea ?

Would you be able to provide the code snippet?

Yes, I can provide some code. Publication is

Meteor.publish('sessions.listAssignedOpenSessions', function (subDomain) {
    const tenant = getOrCreateTenant(subDomain)
    if (!this.userId) return this.ready();
    return SessionsCollection.find({ tenantId: tenant._id, assignedTo: this.userId, status: SessionStatus.Open });

And the getOrCreateTenant method (from which the crash occurs) is

export function getOrCreateTenant(subdomain: string): Tenant {
    const user = Meteor.user({ fields: { "tenantName": 1 } }) as User
    const name = user ? user.tenantName || subdomain : subdomain;
    const result = Promise.await(
            { name },
                $setOnInsert: {
                    _id: new Mongo.ObjectID().toHexString(),
                    name, sessionCounter: 0, createdAt: new Date
            { upsert: true, returnDocument: 'after' }))
    if (result.ok === 1 && result.value) {
        return result.value;
    } else {
        throw new Meteor.Error('', JSON.stringify(result.lastErrorObject))

The problem occurs on the first line of this function, only when called from publication invoked by simple:rest. Otherwise the publication works fine when invoked from client app.