One month down in 2025: How are your resolutions coming along? Check out how to get back on track here.
Forum Discussion
edodgen
2 years agoNew member | Level 2
API File Search
I have written this code out in many different ways. I FINALLY got it to work within the limit rates, but now my search is not returning matches. I am just trying to find ANY image filename in the entire account that includes a sku from the database.
The code runs fine, just does not find any matches that I know exists in the account.
Any advice helps.
const AWS = require('aws-sdk');
const fs = require('fs');
const mysql = require('mysql2/promise');
const path = require('path');
const Dropbox = require('dropbox').Dropbox;
const throttledQueue = require('throttled-queue');
const dbx = new Dropbox({
accessToken:
'#',
});
const pool = mysql.createPool({
connectionLimit: 16,
host: 'localhost',
user: 'root',
password: '#',
database: 'absdropbox',
});
const throttledRequestsPerSecond = 15;
const throttle = throttledQueue(throttledRequestsPerSecond, 1000);
async function getSKUs() {
const [rows] = await pool.query('SELECT sku FROM oe');
return rows.map((row) => row.sku);
}
async function queryDropbox(query) {
const options = {
path: '',
// path: '/home/2022',
mode: 'filename_and_content',
query: query,
};
try {
const response = await dbx.filesSearchV2(options);
return response.matches ?? [];
} catch (error) {
console.error(error);
return [];
}
}
let i = 0
async function processSKU(sku) {
// const query = `filename LIKE '%${sku}%'`;
// const query = `filename LIKE '_${sku}_'`;
const query = `search('${sku}')`;
const matches = await queryDropbox(query);
console.log(i++)
if (matches.length === 0) {
console.log(`No matches found for SKU ${sku}`);
return;
}
console.log(`Found ${matches.length} match(es) for SKU ${sku}`);
for (const match of matches) {
const { path_display } = match.metadata;
const filename = path.basename(path_display);
const fileStream = fs.createWriteStream(filename);
try {
const { data } = await dbx.filesDownload({ path: path_display });
data.pipe(fileStream);
await new Promise((resolve, reject) => {
fileStream.on('finish', resolve);
fileStream.on('error', reject);
});
const s3 = new AWS.S3({ region: 'us-east-2' });
const s3Params = {
Bucket: 'dbexctract',
Key: filename,
Body: fs.createReadStream(filename),
};
await s3.upload(s3Params).promise();
console.log(`File ${filename} uploaded to S3`);
} catch (error) {
console.error(error);
} finally {
fs.unlinkSync(filename);
}
}
}
async function run() {
const skus = await getSKUs();
for (const sku of skus) {
await throttle(() => processSKU(sku));
}
}
run();
- Greg-DB
Dropbox Staff
If I understand, it sounds like you're calling 'filesSearchV2' with a particular 'query' that is expected to match something in the connected account, but 'response.matches' is coming back empty. Is that correct? In that case, it would be best to open a ticket here from the affected account and include the options you are using, including a sample 'query' value, that are unexpectedly not producing results so we can look into it specifically for you.
- Greg-DB
Dropbox Staff
edodgen I was looking through your code, and I see you're using 'response.matches' to access the search matches. What version number of the SDK are you using? If you're using v6 or greater, you should instead access the matches as 'response.result.matches'.
Also, I notice you're using parameters from FilesSearchArg which is meant for filesSearch; for the newer filesSearchV2 you should be using FilesSearchV2Arg instead.
Please try those changes and let us know if that helps.
About Dropbox API Support & Feedback
Find help with the Dropbox API from other developers.5,950 PostsLatest Activity: 9 hours ago
If you need more help you can view your support options (expected response time for an email or ticket is 24 hours), or contact us on X or Facebook.
For more info on available support options for your Dropbox plan, see this article.
If you found the answer to your question in this Community thread, please 'like' the post to say thanks and to let us know it was useful!