Starting with asynchronous JS and promises
There is a problem regarding error handling: in callDB() you catch all exceptions and log them in the console without passing them on to the caller. Either you should rethrow the exception (or a modified version that is more helpful for the caller) or not catch it at all. Since the MongoClient.connect() can also fail, I would move it into the try/catch as well:
async function getDataFromMongoDB() {  // renamed so you don't need the comment
    try{
        const connection = await MongoClient.connect( uri, {
            useNewUrlParser: true,
            useUnifiedTopology: true
        });
        return await connection
            .db(&quot;todos&quot;)
            .collection(&quot;items&quot;)
            .find({})
            .toArray();
    } catch(e) {
        console.log(e);
        throw e; // or throw something else
    }
}

This would be even more concise if you would extract the creation of the connection into its own function. However, I think you would like to write the whole function in one expression after the return, you would have to write it like this:
return await (await getConnection()).db(&quot;todos&quot;)...

The first await is required to keep error handling in this function.
The request handler can also make use of async/await:
app.get(&quot;/todos&quot;, cors(), async (req, res)=&gt; {
    try {
        const response = await callDB();
        res.json(response);
    }
    catch (e) {
        console.log(e);
    }
});