Closed
Description
New Issue Checklist
- I am not disclosing a vulnerability.
- I am not just asking a question.
- I have searched through existing issues.
- I can reproduce the issue with the latest version of Parse Server.
Issue Description
const distinctResult = await query.distinct("score");
parse-server v6.3.1 This code will give you an error.
ParseError: Invalid aggregate stage 'hint'.
Steps to reproduce
src/cloud/main.js
Parse.Cloud.define('getObject', async (request) => {
try {
const className = 'GameScoreXXX';
const objectId = "3JrNlj8Wkf";
const query = new Parse.Query(className);
const distinctResult = await query.distinct("score"); // throw ParseError: Invalid aggregate stage 'hint'.
const object = await query.get(objectId);
return object.toJSON();
} catch (error) {
console.log('error-->', error)
throw new Parse.Error(500, 'Failed to update object: ' + error.message);
}
});
// src/index.js
var express = require('express');
var ParseServer = require('parse-server').ParseServer;
const PORT = 1337;
...........................................
var api = new ParseServer({
databaseURI: database.uri,
cloud: server.cloud,
appId: server.appId,
masterKey: server.masterKey
});
var app = express();
(async ()=>{
await api.start()
app.use("/parse", api.app)
var httpServer = require('http').createServer(app)
httpServer.listen(PORT, function() {
console.error('parse-server-mojitest running on port ' + PORT + '.')
})
})()
Actual Outcome
ParseError: Invalid aggregate stage 'hint'.
Expected Outcome
no error message
Environment
Server
- Parse Server version:
V6.3.1
- Operating system:
win11
- Local or remote host (AWS, Azure, Google Cloud, Heroku, Digital Ocean, etc):
local
Database
- System (MongoDB or Postgres):
MongoDB
- Database version:
5.0
- Local or remote host (MongoDB Atlas, mLab, AWS, Azure, Google Cloud, etc):
Local
Just use the third release tool to request it directly
Logs
Some Detail
// Parse-server V5.6.1 src/Routers/AggregateRouter.js
export class AggregateRouter extends ClassesRouter {
handleFind(req) {
const body = Object.assign(req.body, ClassesRouter.JSONFromQuery(req.query));
const options = {};
if (body.distinct) {
options.distinct = String(body.distinct);
}
// Here body.hint : underfined, so it doesn't delete to the
if (body.hint) {
options.hint = body.hint;
delete body.hint;
}
// so body.hint : underfined
}
So when stageName=hint here, it's a direct error
static transformStage(stageName, stage) {
const skipKeys = ['distinct', 'where'];
if (skipKeys.includes(stageName)) {
return;
}
if (stageName[0] !== '$') {
throw new Parse.Error(Parse.Error.INVALID_QUERY, `Invalid aggregate stage '${stageName}'.`);
}
}
}